【问题标题】:How to reference an object in an other object如何在另一个对象中引用一个对象
【发布时间】:2012-11-25 16:36:04
【问题描述】:

我正在尝试编写具有 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

为什么会这样,解决上述问题的正确方法是什么

【问题讨论】:

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


    【解决方案1】:

    你在draw中输出引用的地址。

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

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

    【讨论】:

    • 但这就是我想要做的。我试图在所有“视口”中拥有相同的“场景”。我正在尝试仅通过引用地址来做到这一点。
    • 在 Draw 中你输出 cout &lt;&lt; &amp;mScene; 这是本地引用的地址。不是您引用的场景对象的地址。要输出场景对象的地址,您只需使用cout &lt;&lt; mScene';
    • 谢谢你,这只是一个错字,但对于这部分问题,这是正确的答案。
    • "您正在 mScene 中存储一个场景&。" - 实际上,它是一个Scene*。 “那么你正在获取该引用的地址” - 它实际上是指针的地址。
    【解决方案2】:
    1. 现在,第一个视口初始化一个空场景指针,地址为 CCCCCCCC。此获取已更新为主场景的地址。这就是我想要实现的目标。
    CCCCCCCC <- mScene before
    0016FBD3 <- &scene before
    0016FBD3 <- mScene after
    0016FBD3 <- &scene after
    

    然而,其他观点已经开始于正确的地址,而不是 CCCCCCCC。为什么会这样?

    在给 mScene 赋值之前打印 mScene,因此内存中的任何垃圾值都会显示出来 - 显然它恰好是 CCCCCCCC,但如果你在这里或那里稍微改变你的程序,或者改变编译器或优化级别,您可能会得到完全不同的值。您甚至可能在每次运行程序时得到不同的值,否则程序可能会崩溃。从尚未设置的变量中读取值是未定义的行为。简单来说,您的代码cout &lt;&lt; mScene &lt;&lt; endl; 需要从mScene 中读取才能打印出来,这在= 赋值之后是可以的,但之前不行。

    对于视口 2、3、4,它看起来像这样:

    0016FBD3
    0016FBD3
    0016FBD3
    0016FBD3
    

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

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

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

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

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

    【讨论】:

    • 感谢您澄清这一点!
    猜你喜欢
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多