-2

我有这样的结构

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 

我可以编译此代码,但在运行时出现段错误。我有一个限制,我不能使用指针。这不是家庭作业。由于构建 SSA 的问题,我用作反向编译器的编译器限制使用指针

4

4 回答 4

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`

您上面的代码不应该编译,因为 astructure不能以这种方式创建,因为它没有自动默认结构,因为它有一个引用成员。此外,即使它确实编译了,该A成员也将是 的父对象的副本,BaseObject 或者其他一些不是你想要的奇怪的东西。DerivedObjectBBaseObject

绝对确定你不能在那里使用指针吗?这根本没有意义,并且很难处理。

于 2012-06-12T18:00:26.150 回答
1

您不能更改 A 引用的对象,一旦structure被构造。您可能想要的是:

struct structure
{
  structure() : A(NULL) {}
  ~structure() { if (this->A) { delete this->A; } }
  BaseObject * A;
};

structure *s = new structure;
s->A = new DerivedObjectB();

无论如何,使用原始指针很容易出错,您应该考虑一下。

于 2012-06-12T17:52:23.883 回答
0

我打赌你刚刚宣布

structure* s;

或者

structure* s = NULL;

亚里特?否则,没有理由崩溃。

s->A引用超出范围的对象,因此当您调用operator =它时,您会遇到未定义的行为。

是这两者之一。

于 2012-06-12T17:38:02.773 回答
0

这甚至不应该编译。引用在构造后无法反弹,并且您应该收到一个错误,告诉您它必须绑定到某个东西。

于 2012-06-12T17:57:29.657 回答