访问专用数据类型

时间:2013-11-12 17:16:12

标签: c++ struct

#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. 如何在派生类中创建结构“type”的实例。
  2. 请告诉我如何使用“数据类型”。

      

    错误:'typedef struct A :: type A :: type'是Private。

    先谢谢。

5 个答案:

答案 0 :(得分:1)

一些可能性:

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

  • friend class B;中使用A(但我认为你也可以保护类型)。

  • 丑陋的黑客:在B中重新声明结构,创建相同的类型。然后使用memcpy在需要时在类型的变量之间进行复制。

答案 1 :(得分:1)

您不能使用基类中的任何private,它是该语言的规则。

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

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

(一般情况下,最好保持内聚命名:如果适用,请考虑将函数CreateInstance声明为虚拟,然后将CreateInstance1重命名为CreateInstance以使其覆盖{{1}但是,这与问题无关。

答案 2 :(得分: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;   
}        

答案 3 :(得分: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

,它会创建不必要的临时对象

答案 4 :(得分: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;
}

此解决方案有效,因为私有隐藏名称而不是类型。所以我们仍然可以通过使用public typedef包装它来公开类型。