#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;
}
我期待对此提出一些建议。
请告诉我如何使用“数据类型”。
错误:'typedef struct A :: type A :: type'是Private。
先谢谢。
答案 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包装它来公开类型。