我有一个棘手的情况。它的简化形式是这样的
class Instruction
{
public:
virtual void execute() { }
};
class Add: public Instruction
{
private:
int a;
int b;
int c;
public:
Add(int x, int y, int z) {a=x;b=y;c=z;}
void execute() { a = b + c; }
};
然后在一个类上我做类似...
void some_method()
{
vector<Instruction> v;
Instruction* i = new Add(1,2,3)
v.push_back(*i);
}
在另一个类中...
void some_other_method()
{
Instruction ins = v.back();
ins.execute();
}
他们以某种方式共享此指令 vector 。我关心的是我执行“执行”功能的部分。能行吗它会保留其添加类型吗?
最佳答案
不,不会。
vector<Instruction> ins;
存储值,而不是引用。这意味着无论您如何使用,那里的指令对象都将在将来的某个时刻被复制。
此外,由于您要使用
new
进行分配,因此上述代码会泄漏该对象。如果要正确执行此操作,则必须执行vector<Instruction*> ins
或者,更好的是:
vector< std::reference_wrapper<Instruction> > ins
我喜欢这个this blog post来解释
reference_wrapper
此行为称为object slicing.