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

一些可能性:

  • 将类型更改为受保护(但您说不能)。

  • 使用friend class B;in A(但我想你也可以使类型受到保护)。

  • Ugly hack:在 中重新声明结构B,创建相同的类型。然后memcpy根据需要在类型的变量之间进行复制。

于 2013-11-12T17:27:56.250 回答
1

你不能使用private基类中的任何东西,这是语言的规则。

但是,您可以使用任何公开或受保护的内容。在您的情况下,它可能足以调用基类函数CreateInstance

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

(通常最好保持一致的命名:如果适用,请考虑声明函数CreateInstancevirtual 然后重命名CreateInstance1CreateInstance使其覆盖A::CreateInstance. 虽然它与问题无关)。

于 2013-11-12T17:28:34.447 回答
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 回答
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

如果您需要它如此糟糕地工作,您可以在这些行中尝试一些东西

在 A 中添加一个创建对象实例的静态方法

静态 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 回答