2

我实际上正在测试一个文件并且我有一种情况,我需要从 main.cpp 访问该类的一些受保护成员。我尝试添加main()为朋友,但没有成功,并得知它不起作用,所以我将所有内容main()移至 atest ()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
4

4 回答 4

2

不,它绝对不必在同一个文件中,但它显然必须“知道”类是什么,即:具有类定义的头文件应该包含在实现函数的文件中。如评论所述,您的代码应该没问题。

在你添加了一些上下文之后

您的test函数不在Files命名空间中。如果您希望它位于全局上下文中,则应将其视为::test命名空间中的“”,否则编译器可能会认为“ Files::test”是友元函数,而不是::test您的情况中的“”。找不到正式的标准参考,但我很确定是这样。请注意,您在此处执行前向声明,因此没有默认回退到名称解析的上层范围。

于 2012-04-09T00:45:54.907 回答
1

也许您在 Derived 类中缺少继承声明?

 class Derived : public Base {

我已经测试了您的代码(包括继承声明)并且没有产生错误

于 2012-04-09T00:49:59.367 回答
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;
    } 
}
于 2012-08-30T16:31:35.007 回答
-1

我猜您正在尝试访问 Files 类定义范围之外的受保护变量。我会推荐一个函数,它在被调用时返回变量 word 并使用它而不是尝试访问类定义之外的受保护变量。我可能是错的,因为我不确定受保护变量的范围是什么(它是否仅限于类声明或是否可以在类定义之外访问),但我很确定我是对的,因为受保护的变量就像私有变量。它们只能在类范围内访问。如果我错了,请纠正我。

编辑:哦,对不起,我没有意识到你在做什么。littleadv 是对的,您的函数声明不在文件命名空间内。

于 2012-04-09T01:47:17.220 回答