0

4 つの視点を持つアプリケーションを作成しようとしています。すべてのビューポートで参照されるシーン オブジェクトが必要です。私がやりたいことは、シーン オブジェクトが変更された場合に、すべての視点が更新されることです。これが私が今それを実装しようとしている方法です:

#include <iostream>
#include <vector>

using namespace std;

class Scene
{
};

class Viewport
{
    public:
        Viewport( Scene &scene );
        void draw();

    private:
        Scene           *mScene;
};

Viewport::Viewport( Scene &scene )
{
    cout << mScene << endl;
    cout << &scene << endl;
    mScene = &scene;
    cout << mScene << endl;
    cout << &scene << endl << endl;
}

void Viewport::draw()
{
    cout << &mScene << endl;
}

int main( int argc, char *argv[] )
{
    Scene mScene;
    vector<Viewport> mViewPorts;

    mScene = Scene();

    cout << "init: " << endl;
    for( int i = 0; i < 4; i++ )
        mViewPorts.push_back( Viewport( mScene ) );

    cout << "main: " << endl;
    cout << &mScene << endl << endl;

    cout << "draw: " << endl;
    for( int i = 0; i < 4; i++ )
        mViewPorts[i].draw();
}

私の問題は次のとおりです

1. 現在、最初のビューポートは空のシーン ポインターをアドレス CCCCCCCC で初期化しています。これは、メイン シーンのアドレスに更新されます。これが私が達成しようとしていることです。

CCCCCCCC <- mScene before
0016FBD3 <- &scene before
0016FBD3 <- mScene after
0016FBD3 <- &scene after

ただし、他のビューポイントは、CCCCCCCC ではなく、正しいアドレスで既に開始されています。なぜこうなった?

ビューポート 2、3、4 では次のようになります。

0016FBD3
0016FBD3
0016FBD3
0016FBD3

2. しかし、私の主な問題は、私のコンセプトが機能しないことです。draw() を呼び出すと、ビューポートはすべて、以前に設定したものとはまったく異なるアドレスを持っています。

draw:
00398730
00398734
00398738
0039873C

なぜこれらが起こっているのでしょうか。また、上記の問題を解決する正しい方法は何ですか?

4

2 に答える 2

1

描画で参照のアドレスを出力しています。

に を格納しScene*ていmSceneます。次に、そのポインターのアドレスを取得します。これは、クラスのインスタンスごとに異なります。

しかし、他の問題で何が起こっているのかわかりません。別のシーン インスタンスで別のビューポートを初期化してみて、それが機能するかどうかを確認できますか?

于 2012-12-07T13:35:23.833 に答える
0
  1. 現在、最初のビューポートは空のシーン ポインターをアドレス CCCCCCCC で初期化しています。これは、メイン シーンのアドレスに更新されます。これが私が達成しようとしていることです。
CCCCCCCC <- mScene before
0016FBD3 <- &scene before
0016FBD3 <- mScene after
0016FBD3 <- &scene after

ただし、他のビューポイントは、CCCCCCCC ではなく、正しいアドレスで既に開始されています。なぜこうなった?

値を割り当てる前に mScene を出力するので、メモリに残っていたガベージ値が表示されます - たまたま CCCCCCCC だったのは明らかですが、プログラムをあちこちで少し変更したり、コンパイラや最適化レベルを変更したりした場合は、まったく異なる値が得られる可能性があります。プログラムを実行するたびに異なる値を取得したり、プログラムがクラッシュしたりする可能性もあります。設定されていない変数から値を読み取ることは未定義の動作です。簡単に言えば、コードcout << mScene << endl;は mScene から読み取って印刷する必要があります。これは、=割り当ての後では問題ありませんが、前では問題ありません。

ビューポート 2、3、4 では次のようになります。

0016FBD3
0016FBD3
0016FBD3
0016FBD3

各一時ビューポートを作成してプッシュバックすると、ほぼ確実にプログラムのスタック内の同じ場所に作成されるため、このように見えます...最初に CCCCCCCC だったメモリの内容は、前回のメモリの値によって上書きされましたは以前の Viewport オブジェクトに使用されていましたが、値は何もリセットされずに読み取られるため、以前の Viewport からの古い値が表示されます。

  1. しかし、私の主な問題は、私のコンセプトが機能しないことです。draw() を呼び出すと、ビューポートはすべて、以前に設定したものとはまったく異なるアドレスを持っています。
draw:
00398730
00398734
00398738
0039873C

なぜこれらが起こっているのでしょうか。また、上記の問題を解決する正しい方法は何ですか?

各ビューポート オブジェクトには、シーンへのポインターが含まれています。シーンは 1 つしかありませんが、4 つのビューポートには、示されているメモリ アドレスに 4 つの異なるポインターがあり、すべてが単一のシーンの同じアドレスを含んでいます。

&mScene の代わりに mScene を印刷すると、期待する値が表示されます。

于 2012-12-07T13:51:14.420 に答える