私は実際にファイルをテストしており、main.cppからクラスの保護されたメンバーの一部にアクセスする必要がある状況があります。私は、友人としてmain()
を追加しようとしましたが、うまく動かず、働かないと学んだので、main()
のすべてをtest()
に移動し、test()
を友人にしました。それでもエラーが表示されます。ベース::値が保護されています:友人機能は同じファイル内にある必要がありますか?
例は
//--File.hpp
namespace Files {
class File {
public:
File(long word_):word(word_) {}
protected:
long word;
private:
friend int test();
};
}//ns:Files
//--List_File.hpp
namespace Files {
class List_File :public File {
public:
List_File() : File(sizeof(int) + sizeof(long)) {}
private:
friend int test();
};
}//ns:Files
//--main.cpp
using namespace Files;
int test() {
File *pd = new List_File();
assert(pd->word == 12); //LINE 34
return 0;
}
int main() {
test();
return 0;
}
//それはライン34上の誤差は言うだろう。ご意見をお聞かせください。
g++ -O -Wall -Wno-unused -o a.out File.cpp List_File.cpp Data_File.cpp
Free_List_File.cpp main.cpp
File.hpp: In function ‘int test()’:
File.hpp:30:7: error: ‘long int Files::File::word’ is protected
main.cpp:34:16: error: within this context
make: *** [a.out] Error 1
(G ++ 4.2の下で)私にとっては罰金コンパイル掲示コード私は派生クラス宣言を変更した後に、(それは言うべき「クラス派生:公共の基本」を、しかし: "公共の基地"がありません) –
ええええええええええええええんはそこにあります..私は再び確認します。 – howtechstuffworks
@JeremyFriesner上記のコードスニペットは、g ++ 4.4.5でコンパイルしたときに同じエラーが発生するのは不思議です。それは名前空間に関係するものですか?おそらく、 'test'を名前空間' Files'に実装するべきです。サウンドリファレンスを見つけることができないので、コメントだけです。 –