如何在C ++中超类化一些数据结构?

时间:2012-07-09 16:05:50

标签: c++ inheritance

我有一个带有100个数据结构的C头文件。我想创建一个每个数据结构继承自的超类。怎么做?我应该解析头文件吗?反射?

因为每个C数据结构都是一个公共类,所以我可以创建一个超类,然后...然后是什么?我不应该手动并明确地使每个结构继承自超类?

4 个答案:

答案 0 :(得分:2)

对于您的特定用例,我将保留C代码,并在C ++中利用C代码创建您需要的任何解决方案。例如,您可以创建一个带有基础的并行层次结构,该基础定义包含serialize()deserialize()的接口,每个派生类型存储一个C结构并实现该特定类型的序列化。

您还可以通过提供为每个C结构定义的模板化serialize / deserialize函数来完全解决外部问题...继承是C ++最常被滥用的功能之一

最好的解决方案将取决于您打算如何使用代码,但我会避免重写C代码(即脚本编辑器将C头重写为C ++解决方案),因为它将有效地从C库中分支出来如果你需要扩展它,你将需要维护两个独立的分支。

答案 1 :(得分:2)

如果你有一堆结构:

显而易见的答案是巧妙地使用搜索和替换来使它们从新的基类继承。它将无法访问结构的成员,但您可以在容器中存储指向它们的指针

struct base {
    int dostuff() const {std::cout << "thing";}
};
struct thing1 : public base {
    int size;
};
//otherstructs inheriting from base
int main() {
    std::vector<std::unique_ptr<base>> objects;
    objects.push_back(std::unique_ptr<base>(new thing1()));
    objects[1].dostuff();
}

如果使基类的事情太难,您可以尝试通过 wrapper 类添加函数。您将无法在容器中存储指向这些指针,但只要结构具有相似的成员,它们就可以访问成员。

struct thing1 {
    int size;
};
//other unchanged structs
template<class mystruct>
struct wrapper : mystruct {
    int getsize() {return mystruct.size;}
};

int main() {
     wrapper<thing1> mything1;
     std::cout << mything1.size << mything1.getsize();
}

或者,如果您只是添加方法,请将它们分开:

struct thing1 {
    int size;
};
//other unchanged structs
template<class T>
int getsize(const T& obj) {return obj.size;}

int main() {
     thing1 mything1;
     std::cout << mything1.size << getsize(mything1);
}

答案 2 :(得分:1)

C / C ++中没有反射,并且C ++中没有其他类的基类,所以这不是一件容易的事。您可以按照建议手动创建从超类继承的每个类,也可以创建基类,然后为每个数据结构创建一个新结构,继承它的具体数据结构和基类。 例如http://liveworkspace.org/code/7e06e0374ef41bc4aeeafd55ae143527http://liveworkspace.org/code/7e06e0374ef41bc4aeeafd55ae143527 我认为手动使每个结构从C-header文件中的基类继承更有效。

答案 3 :(得分:1)

我从来没有听说过使用继承的结构 - 它可能是某个地方的标准实践,但是继承的所有示例都使用了一个类 - 它会将结构更改为类吗?这可能会令人困惑,因为当我看到结构时,我倾向于认为“C”。

你还确定继承,你还需要100个结构或类吗?如果他们确实没有重复的数据,那就没问题,但如果有重复的字段,最好让它们相互继承以删除重复的字段。