【发布时间】:2012-04-21 12:04:11
【问题描述】:
我实际上是在测试一个文件,我有一种情况,我需要从 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 行显示错误:Base::value 受到保护。请指教。
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 下)(它应该说“类派生:公共基础”,但“:公共基础”不见了)
-
是的,公共基地在那里..我会再检查一次。
-
@JeremyFriesner 奇怪的是,上面的代码 sn-p 在使用我的 g++ 4.4.5 编译时会出现同样的错误。它与命名空间有关吗?我的意思是也许你应该在命名空间
Files中实现test。找不到可靠的参考,所以只是评论。
标签: c++ inheritance friend protected access-specifier