考虑以下类
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++ 习语是什么?