朋友的功能必须在同一个文件中吗?

时间:2012-04-09 00:33:05

标签: c++ inheritance friend protected access-specifier

我实际上正在测试一个文件而且我有一种情况,我需要从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;
  }

4 个答案:

答案 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命名空间内。