我有这样的结构
struct structure
{
BaseObject &A; //BaseObject has a function declared as virtual
};
在运行时,我动态地将对象分配给& A
structure *s = new structure;
DerivedObjectB *B = new DerivedObjectB(); //Derived class overloads the virtual function
s->A = *B; //s is a pointer of the structure. S has been initialized
我可以编译这段代码但是我在运行时遇到了一个seg-fault错误。 我有一个限制,我不能使用指针。 这不是作业。我用作反向编译器的编译器由于构建SSA的问题而限制使用指针
答案 0 :(得分:2)
如果无法使用指针,则必须使用引用。 如果您使用引用,则必须将初始化为其构造的最终值。
struct structure
{
BaseObject &A; //BaseObject has a function declared as virtual
structure(BaseObject &A_) : A(A_) {}
};
DerivedObjectB *B = new DerivedObjectB();
structure *s = new structure(*B); //done
//keep in mind you cannot delete `B` until _after_ you delete `s`
上面的代码不应该编译,因为无法以这种方式创建structure
,因为它没有自动默认结构,因为它有一个引用成员。此外,即使它已编译,A
成员也将是BaseObject
的父DerivedObjectB
个对象的BaseObject
副本,或者其他一些不喜欢你不想要的东西。
你绝对确定你不能在那里使用指针吗?这完全没有意义,并且使这很难使用。
答案 1 :(得分:1)
构建structure
后,您无法更改A引用的对象。
你可能想要的是:
struct structure
{
structure() : A(NULL) {}
~structure() { if (this->A) { delete this->A; } }
BaseObject * A;
};
structure *s = new structure;
s->A = new DerivedObjectB();
无论如何,使用原始指针很容易出错,你应该考虑它。
答案 2 :(得分:0)
我打赌你刚宣布
structure* s;
或
structure* s = NULL;
amirite? 否则,没有理由发生崩溃。
或 s->A
引用超出范围的对象,因此当您在其上调用operator =
时,您会遇到未定义的行为。
这是这两个中的一个。
答案 3 :(得分:0)
这甚至不应该编译。施工后参考不能反弹,你应该收到一个错误,告诉你它一定是绑定的。