C ++:C struct的继承或类成员?

时间:2018-01-19 17:36:45

标签: c++ inheritance struct

我有一个普通的老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函数吗?或者,最好是保留指向结构的指针吗?

3 个答案:

答案 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}}的动态内存分配。