如何引用其他对象中的对象

时间:2012-12-07 13:31:06

标签: c++ oop pointers pass-by-reference

我正在尝试编写一个包含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

为什么会发生这种情况,解决上述问题的正确方法

2 个答案:

答案 0 :(得分:1)

您正在输出参考地址。

您正在Scene*中存储mScene。然后你将获取该指针的地址,这对于每个类的实例都是不同的。

我不知道其他问题发生了什么。您是否可以尝试使用不同的场景实例初始化另一个视口,看看是否有效?

答案 1 :(得分:0)

  
      
  1. 现在,第一个视口初始化一个地址为CCCCCCCC的空场景指针。此获取已更新为主场景的地址。这就是我想要实现的目标。
  2.   
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

它看起来像这样,因为当你构造每个临时Viewport来推回它们时,它们几乎肯定是在程序堆栈中的同一个地方构建的......最初CCCCCCCC的内存内容已经被前面的值覆盖了内存用于上一个Viewport对象的时间,但由于读取的值没有重置为任何内容,因此您会看到早期Viewport中的旧值。

  
      
  1. 然而,我的主要问题是我的概念不起作用。当我调用draw()时,视口的地址都与我之前设置的地址完全不同。
  2.   
draw:
00398730
00398734
00398738
0039873C
  

为什么会发生这些问题,解决上述问题的正确方法是什么?

每个视口对象都包含指向场景的指针。您只有一个场景,但是四个视口在显示的内存地址上有四个不同的指针,它们都包含单个场景的相同地址。

如果您打印mScene而不是&amp; mScene,您将看到您期望的值。