我有一个接口(interface)实现的中心列表,并且希望派生类能够在该列表中注册自己,而不必将它们添加到某个中心位置。例如:
// interface.h
struct MyInterface;
std::vector<MyInterface*>& InterfaceList();
struct MyInterface {
MyInterface() {
InterfaceList().push_back(this);
}
virtual ~MyInterface() {}
// ...
};
// derived.cpp
#include "interface.h"
class MyImplementation: public MyInterface {
public:
MyImplementation() {
}
// ...
};
MyImplementation impl;
这似乎不起作用。由于我不明白的原因,MyInterface 的构造函数永远不会被调用 - 我本以为派生类的实例会在启动时调用它。我知道可以按照这些思路做一些事情,因为我已经看到其他库这样做了 - 但还没有弄清楚我做错了什么。
谢谢:)
编辑:抱歉,错过了一对大括号和引用文献。 InterfaceList() 是一个返回 vector 引用的函数。
编辑第 2 部分:现在可以在简化的示例中使用它,但无法在派生实现的文件中使用它 - 但该技术正在另一个项目中使用。这些文件中肯定有一些稍微不同的东西导致它失败 - 但问题似乎不在我发布的代码中。不过,我真的不想发布雇主的大部分项目,所以我想我必须继续摆弄自己。感谢您到目前为止的建议:)
最佳答案
您的示例无法在 VS2008 下编译。你使用什么编译器?当您将 interface.h
中的第二行更改为
std::vector<MyInterface*> InterfaceList;
它工作正常。只需去掉大括号即可。
关于c++ - 在中央列表中注册派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3098941/