-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 

このコードをコンパイルできますが、実行時に seg-fault エラーが発生します。ポインターを使用できないという制限があります。これは宿題ではありません。私がリバース コンパイラとして使用しているコンパイラには、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`

上記のコードstructureは、参照メンバーがあるため自動デフォルト構造がなかったため、そのように作成できなかったため、コンパイルされていないはずです。また、コンパイルAされたとしても、メンバーはの親オブジェクトのBaseObject コピーであるか、その他の奇妙ではないものでした。DerivedObjectBBaseObject

そこでポインターを使用できないと確信していますか? これはまったく意味がなく、これを扱うのは非常に困難です。

于 2012-06-12T18:00:26.150 に答える
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();

とにかく、生のポインタを使用するとエラーが発生しやすいので、それを考慮する必要があります。

于 2012-06-12T17:52:23.883 に答える
0

これはコンパイルすらすべきではありません。参照は構築後にリバウンドできません。また、何かにバインドされている必要があることを示すエラーが表示されるはずです。

于 2012-06-12T17:57:29.657 に答える
0

私はあなたがちょうど宣言したに違いない

structure* s;

また

structure* s = NULL;

アミライト?そうでなければ、クラッシュの理由はありません。

または s->A、スコープ外になったオブジェクトを参照するため、それを呼び出すとoperator =、未定義の動作が発生します。

この2つのうちの1つです。

于 2012-06-12T17:38:02.773 に答える