考虑以下类
class Base {
public:
virtual void do_stuff() = 0;
};
class Derived : public Base {
public
virtual void do_stuff() { std::cout << "I'm useful"; };
};
现在假设我想让另一个类负责拥有Base的派生类型的对象并遍历它们调用它们的do_stuff()方法。看起来像这样,但我不知道T应该声明为
class Owner {
public:
void do_all_stuff() {
//iterate through all items and call do_stuff() on them
}
void add_item(T item) {
items.push_back(item);
}
vector<T> items;
}
我看到了几种可能性:
T不可能Base,因为我只能添加具体类型的对象Base,所以这是不可能的。
T可以是Base*or Base&,但现在我需要相信 的调用者会add_item()向我传递一个指针或对一个对象的引用,当我从items. 我不能delete在Owner的析构函数中使用元素,因为我不知道它们是动态分配的。然而,如果他们是的话,他们应该是delete'd',这让我有模糊的所有权。
T可以是Base*orBase&和我添加一个Base* create_item<DerivedT>() { return new DerivedT; }方法到Owner. 这样,我知道指针将保持有效并且我拥有它,但我无法在DerivedT. 此外,还Owner负责实例化对象。我还必须删除Owner' 的析构函数中的每个项目,尽管这不是什么大问题。
基本上,我希望能够做类似的事情:
Owner owner;
void add_one() {
Derived d;
owner.add_item(d);
}
void ready() {
owner.do_all_stuff();
}
void main() {
for(int i = 0; i < 10; ++i) {
add_one();
}
ready();
}
我确定那里有一些与移动语义相关的东西(我可以移动传递给它们的对象add_items()以拥有它们),但我仍然无法弄清楚我的集合将如何声明。
这种多态所有权(尤其是 STL 容器)的 C++ 习语是什么?