0

クラスがあり、そこに文字列を含む構造体があります。主にクラスを宣言してから、その文字列に到達するための構造体を作成します。それはどのように見えるか:

Class *myClass = new Class;
Class::Struct *myStruct;

myStruct = &myClass->getStruct(); // the struct is in a vector so I get it through a function

cout << myStruct->string << "\n";

したがって、このメソッドでは、構造体の文字列に到達できませんが、int、floatなどに到達できます。コードを次のように変更すると、次のようになります。

Class::Struct myStruct;

myStruct = myClass->getStruct();

cout << myStruct.string << "\n";

その後、それは動作します。

私の質問は、なぜ2番目のものが機能し、最初のものが機能しないのか、そしてなぜ文字列だけが機能するのかということです。それは生と死についてではありません。私はその文字列を本当に必要としないので、プログラムをテストしただけですが、私はまだ言語、特にポインターを学んでいるので、何が起こっているのか本当に興味があります。

前もって感謝します!

編集:わかりました、それで定義

class Class {
public:
    struct Struct {
        string name;
        float data;
    };

    Class();
    Struct getStruct( int i );

private:
    vector<Struct>  tempStruct;
};

Class::Class() {
    Struct str;
    str.name = "test";
    str.data = 1.0f;

    tempStruct.push_back( str );
}

struct Class::getStruct( int i ) {
    return tempStruct[i];
}

EDIT2: それはちょっとした間違いでしたが、&を忘れました。しかし、あなたは私がそれを見つけるのを手伝ってくれました。

4

1 に答える 1

1

これはgetStruct()、構造体のコピーを返すためです。これを「臨時」といいます。一時的なものはすぐに死ぬ。これで、dead temporary へのポインタができました。もう存在しないので、それへのポインタは無効です。の構造体へのポインターまたは参照を返すか、getStruct()次のようにその戻り値への参照を保持します。

const Class::Struct& myStruct = myClass->getStruct();
于 2012-10-26T14:06:12.803 に答える