考虑以下类
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
can be Base*
or Base&
,但现在我需要信任调用者add_item()
向我传递一个指针或对对象的引用,当我从以下位置检索该对象时,该对象仍然存在items
。我不能delete
中的元素Owner
的析构函数,因为我不知道它们是动态分配的。然而,他们应该delete
如果是的话,这会让我的所有权不明确。
T
can be Base*
or Base&
我添加一个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++ 习惯用法是什么?