3

「this」ポインタの値を別のポインタに割り当てる簡単な方法を見つけようとしています。これを実行できるようにしたい理由は、すべてのシードの親アップルオブジェクトへの自動ポインターを使用できるようにするためです。親アップルのアドレスをシードに手動で割り当てることができることはわかっています。MyApple.ItsSeed->ParentApple=&MyApple; しかし、私は「this」ポインタを使用してこれをより便利に行う方法を見つけようとしています。これが推奨/可能かどうかを教えてください。そうであれば、私が間違っていることを教えてください。

これは私が今持っているものです:

main.cpp:

#include <string>
#include <iostream>
#include "Apple.h"
#include "Seed.h"

int main()
{
///////Apple Objects Begin///////
    Apple       MyApple;
    Seed        MySeed;

    MyApple.ItsSeed = &MySeed;

    MyApple.Name = "Bob";

    MyApple.ItsSeed->ParentApple = &MyApple;

    std::cout << "The name of the apple is " << MyApple.Name <<".\n";
    std::cout << "The name of the apple's seed's parent apple is " << MyApple.ItsSeed->ParentApple->Name <<".\n";

    std::cout << "The address of the apple is " << &MyApple <<".\n";

    std::cout << "The address of the apple is " << MyApple.ItsSeed->ParentApple <<".\n";

    return 0;
}

Apple.h:

#ifndef APPLE_H
#define APPLE_H

#include <string>

#include "Seed.h"


class Apple {
public:
    Apple();
    std::string Name;
    int Weight;
    Seed* ItsSeed;
};

#endif // APPLE_H

Apple.cpp:

#include "Apple.h"
#include "Seed.h"

Apple::Apple()
{
    ItsSeed->ParentApple = this;
}

Seed.h:

#ifndef SEED_H
#define SEED_H

#include <string>

class Apple;

class Seed {
public:
    Seed();
    std::string Name;
    int Weight;
    Apple* ParentApple;
};

#endif // SEED_H

Seed.cpp:

#include "Seed.h"

Seed::Seed()
{

}

すべてが正常にコンパイルされます。しかし、ItsSeed-> ParentApple=this;のコメントを外すといつでも プログラムは出力を生成せずにクラッシュします。これは、問題を実証するために考案された例です。問題は「this」ポインタの誤用に関連しているように感じます。または、ある種の循環ループに関係している可能性があります。しかし、私にはわかりません。「this」の値を何かに割り当てても、良い結果は得られません。ありがとう。

4

2 に答える 2

4

ItsSeedその時点では何も初期化していないため、これは予想されます。初期化されていないポインタを逆参照しています。これにより、未定義の動作がトリガーされ、この特定のインスタンスではクラッシュが発生します。

逆参照を試みる前に、null以外のものへのポインターを初期化する必要があります。

たとえば、コンストラクターのペアを使用し、null以外のポインターが指定されている場合にのみ、シードのParentAppleフィールドを設定できます。

Apple::Apple() : ItsSeed(NULL)
{
}

Apple::Apple(Seed * seed) : ItsSeed(seed)
{
    if (seed) {
        seed->ParentApple = this;
    }
}
于 2012-12-26T22:04:05.847 に答える
0

Apple::ItSeedの有効なインスタンスへのポインターで初期化されたメンバーがないため、プログラムがクラッシュしますSeed

于 2012-12-26T22:08:25.253 に答える