0
#include <iostream>

using namespace std;

class A {
      private :
              typedef struct {
                      int a;
                      int j;
                      }type;
      public : 
             A(){};
            ~A(){};   
            void CreateInstance();               
        };

class B : public  A        
{
      private : 
              int d;
              int n;
      public :
             B(){};
            ~B(){};   
            void CreateInstance1();               

};


void A :: CreateInstance()
{ 
 A::type A;
 A.a = 0x10;     
 cout << " Val = " << A.a << endl;
}

void B :: CreateInstance1()
{ 
 // I want to create a Pointer/instance of structure in this function. Dont want to use Public method in Class A    
 A::type A;
 A.a = 0x10;     
 cout << " Val = " << A.a << endl;
}

int main()
{
 A obj;    
 obj.CreateInstance(); 
 B obj1;
 obj1.CreateInstance1();  
 cin.get();
 return 0;   
}        

私はこれについていくつかの提案をすることを楽しみにしています.

  1. 派生クラスで構造体「タイプ」のインスタンスを作成するにはどうすればよいですか。

「データ型」の使い方を教えてください。

エラー: 'typedef struct A :: type A :: type' は非公開です。

前もって感謝します。

4

5 に答える 5

1

private基本クラスからは何も使用できません。これは言語のルールです。

ただし、パブリックまたは保護されているものは何でも使用できます。あなたの場合、おそらく、基本クラス関数を呼び出すだけで十分ですCreateInstance

void B :: CreateInstance1()
{ 
    A::CreateInstance();
}

(一般に、まとまりのある命名を維持することをお勧めします。該当する場合は、関数CreateInstancevirtual を宣言し、名前を変更CreateInstance1CreateInstanceて を上書きすることを検討してA::CreateInstanceください。ただし、質問とは関係ありません)。

于 2013-11-12T17:28:34.447 に答える
1

いくつかの可能性:

  • タイプを保護されたものに変更します(しかし、あなたはできないと言います)。

  • in で使用friend class B;Aます (ただし、タイプを保護することもできます)。

  • 醜いハック: で構造体を再宣言し、B同一の型を作成します。次にmemcpy、必要に応じて型の変数間でコピーするために使用します。

于 2013-11-12T17:27:56.250 に答える
0

うまく動作する必要がある場合は、これらの行で何かを試すことができます

オブジェクト インスタンスを作成する静的メソッドを A に追加します。

static A::type GetTypeInstance();

A::type A :: GetTypeInstance()
{
  A::type lc_Atype;

  return tp;
}

だからあなたのB::CreateInstance1意志は

void B :: CreateInstance1()
{ 
 auto A(A::GetTypeInstance());
 A.a = 0x10;     
 cout << " Val = " << A.a << endl;
}

コンパイラが RVO を実行しない場合、不要な一時オブジェクトが作成されることに注意してください。

于 2013-11-12T17:40:43.533 に答える
0
#include <iostream>

using namespace std;

class A {
      //woh that worked .. i did mistake here
      friend class B;
      private :
              typedef struct {
                      int a;
                      int j;
                      }type;
      public : 
             A(){};
            ~A(){};   
            void CreateInstance();               
        };

class B : public  A        
{
      private : 
              int d;
              int n;
      public :
             B(){};
            ~B(){};   
            void CreateInstance1();               

};


void A :: CreateInstance()
{ 
 A::type A;
 A.a = 0x10;     
 cout << " Val = " << A.a << endl;
}

void B :: CreateInstance1()
{ 
 // I want to create a Pointer/instance of structure in this function. Dont want to use Public method in Class A    
 A::type A;
 A.a = 0x10;     
 cout << " Val = " << A.a << endl;
}

int main()
{
 A obj;    
 obj.CreateInstance(); 
 B obj1;
 obj1.CreateInstance1();  
 cin.get();
 return 0;   
}        
于 2013-11-12T17:30:30.667 に答える
0

私の前の回答はC++ 11を使用しています。自動なしでこれを行う別の方法を次に示します。

class A {
      private :
              typedef struct {
                      int a;
                      int j;
                      }type;
      public : 
             A(){};
            ~A(){};   
            void CreateInstance();   
            typedef type AType;    **//Added this typedef**
        };

B :: CreateInstance1 を次のように変更します

void B :: CreateInstance1()
{ 
 A::AType A;   **//Now this works**
 A.a = 0x10;     
 cout << " Val = " << A.a << endl;
}

この解決策は、private がタイプ自体ではなく名前を非表示にするため機能します。そのため、public typedef を使用してラップすることで、型を公開することができます。

于 2013-11-12T18:12:01.860 に答える