我有一个普通的老C struct
:
struct eggplant {
double *ptr1;
double *ptr2;
... // many more
}
和一个管理指针所指向的内存分配的函数,并返回一个新的eggplant
实例:
struct eggplant *create_eggplant(int n);
上面的函数分配一块内存(包括新创建的struct的空间)并将其分配给指针。
我想在C ++ 11中扩展struct eggplant
。我可以通过将结构指针保持为
class EggPlant {
...
private :
struct eggplant *plant;
}
或者我可以尝试通过
class EggPlant : private struct eggplant {
...
}
第一个选项允许我使用create_eggplant
功能。但是,从概念的角度来看,第二个选项看起来更直接(EggPlant 是茄子类,它不会拥有一个)。
我试过
this = create_eggplant(...);
在构造函数中,但由于您无法覆盖指向正在构造的类的指针(lvalue required
),这不起作用。
我可以继承struct
但仍然以某种有用的方式使用我的create_eggplant
函数吗?或者,最好是保留指向结构的指针吗?
答案 0 :(得分:4)
您选择让struct eggplant *create_eggplant(int n);
管理自己的内存与C ++继承冲突。继承也意味着管理基础对象的位置。
如果您更改了C函数以返回副本:
struct eggplant create_eggplant(int n);
您也可以从该类继承:
class EggPlant : private eggplant {
EggPlant(int n) : eggplant{ create_eggplant(n) }
{
}
...
};
答案 1 :(得分:1)
不,如果你想继承,你需要一个新功能。如果您必须使用现有功能,则会员是您能够管理的最佳成员。
答案 2 :(得分:1)
struct eggplant *create_eggplant(int n);
应该只是:
eggplant *create_eggplant(int n);
这不是C,你不必在任何地方输入struct
。
然而,第二个选项从a看起来更直接 概念上的观点(班级
EggPlant
是茄子,它 没有一个。)
那是错的。 只有公共继承模型是-a 。私有继承模型有一个或是实现的 -
我可以继承结构但仍以某种有用的方式使用我的create_eggplant函数吗?
不,不是以有用的方式,特别是因为create_eggplant
中的malloc
声音被用作eggplant
。
或者,最好是保留指向结构的指针吗?
不,指针使代码更复杂。
如果你想使用私有继承,那么要添加一个构造函数create_eggplant
,或多或少地执行eggplant
现在做的事情,除了为create_eggplant
本身分配内存,或者将void init_eggplant(eggplant& e)
修改为EggPlant
,然后在EggPlant::EggPlant() :
eggplant()
{
init_eggplant(*this);
}
的构造函数中执行此操作:
class EggPlant
{
// ...
private:
eggplant my_eggplant;
}
或者只是不使用私有继承,而是使用普通数据成员:
eggplant
如您所见,所有解决方案的共同目标是摆脱{{1}}的动态内存分配。