0

たとえば、という名前のクラスを作成し、Circleで定義しCircle.hます。

class Circle {
    public:
        Circle *parent;

        Circle();
};

そして、Circle.cppと同じディレクトリの下にある別のファイルでCircle.h、コンストラクターを定義します。

Circle::Circle() {
    // creates a root circle, parent is set to itself
    *parent = ????
}

パーツに何を記入すればよい????ですか?thisAS3では、クラスの関数を定義するときに、キーワードを使用してインスタンス自体を表すことができることを知っています。C ++で何を使用しますか?

編集2012/11/2723:56

別のコンストラクターがあります:

Circle(Circle*);

Circle::Circle(Circle *cParent) {
    *parent = *cParent;
}

また、関数が呼び出されると、新しいインスタンスが作成Circleされ、新しいインスタンス*parentが呼び出し元に設定されます。

void addChild();

void Circle::addChild() {
    Circle child(????);
}

????まだその謎の部分です。私が読んだリソースによると、this廃止されたようですが、他の意味になっていますか?

4

3 に答える 3

2

あなたが探しているキーワードはthis;です。これは、関数が呼び出されたインスタンスへのポインターです。あなたの例では、次のように使用します。

Circle::Circle()
{
  parent = this;
}

parent = this;ではなく 、でなければならないことに注意してください*parent = this;。後者は、ポイントしているオブジェクトに割り当てますparentが、これは無効です(parent値は不確定です)。幸い、オブジェクトにポインタを割り当てるため、コンパイルされません。

このような場合(コンストラクター内でデータメンバーを初期化する)、C ++には初期化構文があります。これは、コンストラクター本体でメンバーを割り当てるよりも一般的に好まれます。コードは次のようになります。

Circle::Circle()
  : parent(this)
{}
于 2012-11-29T14:55:56.593 に答える
1

同様に、C ++では、thisキーワードは現在のオブジェクトへのポインターです。parentこれはポインタなので、間接参照するのではなく、ポインタに直接割り当てる必要があります。

parent = this;

ただし、サークルの親を自分自身にしたいと思いますか?多くの場合、階層の最上位のオブジェクトにはnullの親ポインターがあります。

parent = nullptr;

nullptrまたは、、を使用する、NULLまたはをサポートしないコンパイラで0

parent有効なオブジェクトを指すようにポインターを初期化していないためCircle、コードを逆参照すると、コードは未定義の動作を呼び出します。Circle*次に、型のオブジェクトを型のオブジェクトに割り当てようとしてCircleいます。これについては、コンパイラが文句を言います。

于 2012-11-29T14:55:29.010 に答える
0

私が読んだリソースによると、これは非推奨になっているようですか、それとも他の意味になっていますか?

あなたは悪いリソースを読んでいるか、それらを誤読しています。thisポインタはC++(03 | 11)で正常に動作しています。

後方に移動すると、ミステリーの解決策は次を使用することthisです。

void Circle::addChild() {
    Circle child(this);
}

このコードはほぼ正しいです:

Circle::Circle(Circle *cParent) {
    *parent = *cParent;
}

*parentしかし、逆参照のために完全に正しくparentはありません。これはあなたがやりたいことではありません。あなたがしたいのは、parentポインタを割り当てることであり、次のことをparent指すものに変更を加えることではありません。

Circle::Circle(Circle *cParent) {
    parent = cParent;
}

ctorと同じように:

Circle::Circle() {
    // creates a root circle, parent is set to itself
    parent = ????
}

ただし、この場合、ルートノードには概念的に親がないため、parentそのノードのメンバーはそれ自体を指すのではなく、何も指しません。

Circle::Circle() {
    // creates a root circle, parent is set to itself
    parent = NULL; // or '0' or 'nullptr' with C++11
}
于 2012-11-29T15:06:17.920 に答える