2013-11-12 2 views
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; 
}   

Я надеюсь, что у вас есть предложения по этому вопросу.Доступ к личным Data type

  1. Как создать экземпляр структуры «тип» в производном классе.

Пожалуйста, дайте мне знать, как я могу использовать «тип данных».

Ошибка: 'typedef struct A :: type A :: type' является приватным.

Thanks in Advance.

+3

Сделать общедоступным или защищенным. – jrok

+0

Нет его частного .. мы не можем изменить спецификатор доступа –

+1

использовать 'protected' вместо' private' для объявления 'type' – Raxvan

ответ

1

Некоторые возможности:

  • Изменение типа в защищенный (но вы говорите, что вы не можете).

  • Используйте friend class B; в A (но тогда вы могли бы сделать тип защищенным тоже, я полагаю).

  • Ugly hack: повторно объявить структуру в B, создавая идентичный тип. Затем используйте memcpy для копирования между переменными типов, если это необходимо.

1

Вы не можете ничего private из базового класса используют, это правило языка.

Вы можете, однако, использовать что-либо публичное или защищенное. В вас случае это, вероятно, будет достаточно, чтобы вызвать функцию базового класса CreateInstance

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

(В общем, лучше держать сплоченное именование: если применимы, рассмотреть вопрос об объявлении функции CreateInstance виртуальных, а затем переименовать CreateInstance1 в CreateInstance чтобы сделать его заменой A::CreateInstance. Однако это не связано с вопросом).

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; 
}   
+0

Я не думаю, что «друг» решит ваши проблемы в долгосрочной перспективе. Я думаю, что у вас есть некоторые недостатки дизайна здесь, и нужно переосмыслить, почему и как вы серьезно относитесь к наследованию. –

+0

Да, вы можете предложить мне другой метод, потому что он будет нарушать инкапсуляцию. –

+0

По крайней мере, я не понимаю, какова ваша точка с методом CreateInstance(). хотите создать синглтон или просто предоставить фабричный метод. Как бы то ни было, неясно, к чему вы стремились. В целом я бы сказал, что нет необходимости в 'Cr eateInstance() ', для чего предназначены конструкторы (и да, вы можете легко вызвать конструкторы ваших базовых классов, поскольку они хотя бы защищены) –

0

Если вам это нужно, чтобы работать так сильно, вы можете попробовать что-то в этих строках

Добавить статический метод, который создает объект экземпляры

статического типа A :: 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; 
} 

Обратите внимание, что это создает ненужные временные объекты, если ваш компилятор не делает РВО

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.

Смежные вопросы