我一直在玩一种处理功能对象的方法,我很好奇我是否误解了某些东西,可能会产生更深层次的问题。我问,因为我希望看到这种方法有效,并且更好地了解我正在做的事情。
这个想法非常简单:我创建了一个虚拟访问指针:
struct access { virtual void tick() = 0; };
访问指针的obj(在许多不同之处)将起作用:
struct obj1 :public access
{ void tick() { cout << "I'm being called " << endl; } };
我有&#34;控制器&#34;将(最终)持有并控制行动流程的类:
class container
{
vector<access*>acc_objects; //do these exists by themselves?
public:
void obj_add(access &x) { acc_objects.push_back(&x); }
void tick() { for (auto x : acc_objects)x->tick(); } //active functors
}controller; //there will be only 1
目标(最终)是将指向各种对象的指针发送到访问指针的向量,从而能够将它们称为它们是相同的。无论哪种方式,在这一点上让我感到困惑的是当我这样做时:
{ //in scope
obj1 anobj;
conts.obj_add(anobj);
int x=1; //x in scope
}
conts.tick(); //referrign to the object still works
cout<<x<<endl; //but this does not
为什么我仍然可以参考obj1?这只是未定义的行为,或者该对象仅以某种方式通过引用存在。我也问,因为找到一种方法来存在仿函数对象并且可靠地消失是我试图完成的事情。
编辑:清理问题,从示例中取出一些不相关的代码
答案 0 :(得分:4)
你的错误不是对象切片本身。
{
obj1 anobj;
// ...
}
此处,anobj
超出范围,并在范围的末尾被销毁。
同时,在范围内,指向anobj
的指针会保存在容器中。在范围结束后,通过指针引用对象会导致对被破坏对象的引用。
在任何地方都没有任何切片。整个对象被销毁,随后对该对象的引用包含未定义的行为。