1

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

因为每个 C 数据结构都是公共类,所以我可以创建一个超类,然后……然后呢?我不应该手动进入并显式地使每个结构都从超类继承吗?

4

4 回答 4

2

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

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

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

于 2012-07-09T16:32:06.257 回答
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();
}

如果制作基类太难了,您可以尝试通过包装类添加函数。您将无法将指向它们的指针存储在容器中,但它们可以访问成员,只要结构具有相似的成员。

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);
}
于 2012-07-09T16:33:49.697 回答
1

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

于 2012-07-09T16:12:30.713 回答
1

我从来没有听说过使用继承的结构——这可能是某处的标准做法,但所有继承的例子都是使用类——将结构更改为类会造成困难吗?这可能会让人感到困惑,因为当我看到一个结构时,我倾向于认为是“C”。

您还确定通过继承,您仍然需要 100 个结构或类吗?如果他们真的没有重复数据,那没关系,但如果有重复的字段,最好让它们相互继承以删除重复的字段。

于 2012-07-09T16:19:57.547 回答