0

派生型に対するを持っているshared_ptrが、shared_ptr の型が基本型に対するものである場合、Visual Studio の [ローカル] ウィンドウには基本型のメンバーしか表示されません (まるでオブジェクトがスライスされたかのように)。

以下は、私が見ている問題を示す非常に小さなプログラムです。が作成された後にブレークポイントが設定され、変数が [ローカル] ウィンドウに表示されてshared_ptrいる場合、変数は表示されません。spdvalue

これを見る方法はありますか?マネージ コードに甘やかされてしまったのかもしれません...

#include <memory>

struct Base {
    int ivalue;
};

struct Derived : public Base {
    double dvalue;
};

int main() {
    Derived d;
    d.ivalue = 42;
    d.dvalue = 3.14;
    auto sp = std::make_shared<Base>(d);

    // break here

    return 0;
}
4

1 に答える 1

0

std:make_sharedは、指定したタイプに基づいて新しいオブジェクトを作成するため、コードでは、インスタンス「d」ではなく、「ベース」オブジェクトを作成してそれを指します。

コピー コンストラクターを構造体に追加し、それらにブレーク ポインターを配置して、どれが呼び出されたかを確認できます。

struct Base {
    int ivalue;

    Base(const Base& b)
    {
        ivalue  = b.ivalue;

    }
};

struct Derived : public Base {
    double dvalue;

    Derived(const Derived& b)
    {
        ivalue  = b.ivalue;
        dvalue = b.dvalue;

    }
};

派生オブジェクトの値を確認したい場合は、shared_ptr で「ベース」ポインターの生のアドレスを取得できます。これをウォッチ ウィンドウに追加するだけです。

(Derived*))0x45467890
于 2014-04-10T18:07:44.003 に答える