我有一個簡單的類結構建模離散模擬,其中包含一個狀態矢量,每個狀態矢量都包含多個Transitions,並保存爲智能指針的矢量。我使用智能指針來保存轉換,因爲在我的完整應用程序中我需要多態。將unique_ptr對象推入C++的向量中
#include <vector>
#include <memory>
class Transition {
public:
Transition() {}
};
class State {
public:
State(int num) : num(num), transitions() {}
void add_transition(std::unique_ptr<Transition> trans) {
transitions.push_back(std::move(trans));
}
private:
int num;
std::vector<std::unique_ptr<Transition>> transitions;
};
int main() {
std::vector<State> states;
for (int i = 0; i < 10; i++) {
State nstate = State(i);
for (int j = 0; j < 2; j++) {
nstate.add_transition(std::move(std::unique_ptr<Transition>(new Transition())));
}
// This line causes compiler errors
states.push_back(nstate);
}
}
我添加新的狀態對象爲載體時得到編譯器錯誤:
Error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Transition; _Dp = std::default_delete<Transition>]’
{ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
我想這是由於矢量使國家物體也試圖使一個副本的副本unique_ptrs
這是不允許的矢量的。我已經看到emplace_back
不會像push_back
那樣製作副本,但我仍然得到相同的錯誤。
將狀態對象直接添加到矢量工程中,但我更願意避免這種解決方法,因爲在我的實際代碼中,我使用State對象做了更多的工作,而不是僅僅添加轉換並且不想繼續訪問向量。
int main() {
std::vector<State> states;
for (int i = 0; i < 10; i++) {
states.push_back(State(i));
for (int j = 0; j < 2; j++) {
states[i].add_transition(std::move(std::unique_ptr<Transition>(new Transition())));
}
}
}
添加一個移動構造函數,你可以默認它。 – Nim