我实际上正在测试一个文件而且我有一种情况,我需要从main.cpp访问该类的一些受保护成员。我试图添加,main()
作为朋友,没有成功并且知道它不会工作,所以我将main()
中的所有内容移动到test ()
并创建{{1}作为朋友。它仍显示错误。
示例
test()
//它表示第34行的错误:Base ::值受到保护。请指教。
//--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;
}
答案 0 :(得分:1)
不,它绝对不必在同一个文件中,但它显然必须“知道”该类是什么,即:具有类定义的头应该包含在函数所在的文件中实现。你的代码应该没问题,如评论。
添加了一些上下文后
您的test
函数不在Files
命名空间中。如果您希望它在全局上下文中,您应该在命名空间中将其视为“::test
”,否则编译器可能希望“Files::test
”成为友元函数,而不是“ ::test
“就像你的情况一样。找不到正式的标准参考,但我很确定是这样的。请注意,您在这里执行了前向声明,因此没有默认的回退到名称解析范围的上限。
答案 1 :(得分:1)
也许您在Derived类中缺少继承声明?
class Derived : public Base {
我已经测试了你的代码(包含了继承声明)并且它没有产生错误
答案 2 :(得分:0)
littedev是对的!! 根据littedev的评论更新了代码..
//--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
namespace Files{
int test() {
File *pd = new List_File();
assert(pd->word == 12); //LINE 34
return 0;
}
int main() {
Files::test();
return 0;
}
}
答案 3 :(得分:-1)
我猜你正在尝试访问Files类定义范围之外的受保护变量。我建议一个函数在调用它时返回变量字,并使用它而不是尝试访问类定义之外的受保护变量。我可能错了,因为我不确定受保护变量的范围是什么(它是否仅限于类声明或是否可以在类定义之外访问)但我很确定我是对的因为受保护的变量就像私有变量。它们只能在类范围内访问。如果我错了,请纠正我。
编辑:哦,对不起,我没有意识到你在做什么。 littleadv是对的,你的函数声明不在files命名空间内。