2

私は実際にファイルをテストしていますが、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
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クラス定義のスコープ外で保護された変数にアクセスしようとしていると思います。クラス定義の外部で保護された変数にアクセスしようとする代わりに、呼び出されたときに変数ワードを返す関数をお勧めします。保護された変数のスコープが何であるか(クラス宣言のみに制限されているのか、クラス定義の外部からアクセスできるのか)がよくわからないという点で間違っている可能性がありますが、私は正しいと確信しています。保護された変数はプライベート変数のようなものです。これらは、クラススコープ内でのみアクセスできます。私が間違っている場合は私を訂正してください。

編集:ああ、すみません、あなたが何をしていたのかわかりませんでした。littleadvは正しいです、あなたの関数宣言はファイル名前空間内にありません。

于 2012-04-09T01:47:17.220 に答える