宿題に関しては、私はスケルトンクラスを提供し、ソースファイルのヘッダーから関数を実装するように指示しました。私はヘッダーを変更することが許されていません。実装ファイルにメンバー関数を追加する
しかし、実際にクラスに追加したい機能があります(operator()関数)。ヘッダーを変更せずにクラスの一部として宣言するにはどうすればよいですか?
フレンド機能を追加できません(ヘッダーのクラス定義を変更する必要があります)。私はソースの一番上にそれを実装することはできません(アウトラインの定義は一致しません...)。クラストップを再宣言することはできません(クラスの再定義)。
これも可能ですか?これを行うと、関数本体をコード内の4つの異なる場所にコピーする手間が省けます。
FYI、円、二重にリンクされたリストのアクセサーです。演算子[]はリスト要素の要素にアクセスするために使用され、代わりにリスト要素のポインタを返すアクセサが必要です。参考のため、事業者は次のようになります。
// CANT CHANGE THIS, ITS IN THE HEADER
Elem& operator[](int i) const;
// THIS IS WHAT I WANT THOUGH
// ITS NOT IN THE HEADER, SO I CANT USE IT
CNode * CircleList::operator()(int i) {
CNode * n = this->header->next;
if(i < 0) {
while(i < 0) {
n = (n->prev == this->header) ? (n->prev->prev) : (n->prev);
++i;
}
} else if(i > 0) {
while(i > 0) {
n = (n->next == this->header) ? (n->next->next) : (n->next);
--i;
}
}
return n;
}
問題のヘッダ(の大部分):
#include "point.h"
#include <stdlib.h>
#include <stdio.h>
typedef Point Elem;
class CNode{
private:
Elem elem;
CNode * next;
CNode * prev;
friend class CircleList;
};
class CircleList {
public:
CircleList();
~CircleList();
Elem& operator[](int i) const;
void setElemAt (int i, const Elem newElem) const;
private:
CNode * header;
int _size;
};
しかし
申し訳ありませんが、できません。 – AndyG
ヘッダーを表示できますか? 'header'が保護されているか公開されている場合、継承を使ってこの問題を回避できます。編集:それはまた、テストファイルでポインタの多態的な使用が必要になります。 – AndyG
ヘッダーの** anything **は変更できません。まあ、あまりにも悪い... – DeiDei