我有一个类,它结合了一些结构,例如像这样:
struct _tRack1{
unsigned char shelf1;
unsigned int shelf2;
float shelf3;
};
struct _tRack2{
char shelf1;
int shelf2;
char shelf3;
char shelf4;
};
struct _tRack3{
char shelf1;
unsigned int drawer[5];
};
class Catalog
{
public:
_tRack1 *localdata1;
_tRack2 *localdata2;
_tRack3 *localdata3;
int index;
Catalog(int recktype){
localdata1 = NULL;
localdata2 = NULL;
localdata3 = NULL;
index = recktype;
switch(recktype){
case 1: *localdata1 = new _tRack1; break;
case 2: *localdata2 = new _tRack2; break;
case 3: *localdata3 = new _tRack3; break;
}
};
~Catalog(){
if(localdata1 != NULL) delete localdata1;
if(localdata2 != NULL) delete localdata2;
if(localdata3 != NULL) delete localdata3;
};
int someMethod(_tRack1){/*...*/};
int someMethod(_tRack2){/*...*/};
int someMethod(_tRack3){/*...*/};
};
int main()
{
Catalog *foo = new Catalog(1);
Catalog *bar = new Catalog(3);
/*...*/
if(foo->index>1) foo->localdata1->shelf1=-3;
else foo->localdata1->shelf1=3;
if(bar->index>1) bar->localdata1->shelf1=-3;
else bar->localdata1->shelf1=3;
if(bar->index==3) bar->localdata3->drawer[0] = 0xDEADBEAF;
/*...*/
delete foo;
delete bar;
return 0;
}
我知道将结构公开是不好的,但在现实生活中结构非常复杂,因此不可能创建访问结构的单独字段的方法。 我想找到一种隐藏结构类型的方法。要像这样访问数据:
if(foo->index>1) foo->data->shelf1=-3;
else foo->data->shelf1=3;
if(bar->index>1) bar->data->shelf1=-3;
else bar->data->shelf1=3;
if(bar->index==3) bar->data->drawer[0] = 0xDEADBEAF;
这可能吗?
最佳答案
你应该扔掉你到目前为止所做的任何事情。然后阅读一本关于面向对象编程的书,而不是从头开始。
简单来说,您应该创建一个基类 Rack,然后从中继承特定的 Rack 类型(即派生类)。 Catalog 或任何其他类都不应知道从 Rack 派生的对象的详细信息。它应该要求 Rack 派生对象通过调用它们的虚拟方法来执行操作,而不是请求/访问它们的私有(private)详细信息。
此外 - 现在忘记 new 和 delete 的存在。你还不需要它。它会使您的代码变得更糟。
关于c++ - 如何创建多态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25307170/