c++ - 在中央列表中注册派生类

标签 c++

我有一个接口(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/

相关文章:

c++ - 类成员变量

c++ - 重载运算符删除,否则如何杀死一只猫?

c++ - 多播基础 - 丢失数据

c++ - insert(std::map<int,struct>) 段错误(核心已转储)

c++ - 你如何在 C++ 中删除和附加值到数组?

c++ - 如何正确处理鼠标事件处理程序中的不同情况?

c++ - 一次加和乘 x*y+z 的 cmath 函数

c++ - 为什么箭头运算符 "->"不能在 boost::numeric::ublas::vector<...>::iterator 上工作?

c++ - 使用 decltype 选择函数特化

c++ - 如何准确测量和比较简单 for 循环函数的 OpenCL 速度?