C++ 将指针链接到类之间的指针(通信类)

C++ 将指针链接到类之间的指针(通信类),c++,class,pointers,opengl,reference,C++,Class,Pointers,Opengl,Reference,我已经试着解决我的问题两天了,结果惨败。互联网没有帮助 我试图做的是与驻留在另一个类中的两个类进行通信。 这是我的第一个“大”项目,所以我认为我的设计对你们来说很糟糕。 另外,我的程序被分割成许多文件,这可能会让人困惑 让我们开始吧!为了可读性,我将每个成员都改为public。 这是我的MainOGLController类,它是控制我的程序执行的所有操作的主类: class MainOGLController { // I deleted constructor/destructor from

我已经试着解决我的问题两天了,结果惨败。互联网没有帮助

我试图做的是与驻留在另一个类中的两个类进行通信。 这是我的第一个“大”项目,所以我认为我的设计对你们来说很糟糕。 另外,我的程序被分割成许多文件,这可能会让人困惑

让我们开始吧!为了可读性,我将每个成员都改为public。 这是我的MainOGLController类,它是控制我的程序执行的所有操作的主类:

class MainOGLController
{ // I deleted constructor/destructor from this quote

   public:
        DisplayController*   Display;
        StellarManager*      Manager; // it will need to use something from Display
        void                 RenderScene();
        bool                 CreateNewDisplay(int, char*[]); //  argc argv
}
好的,这就是我如何使用main()在文件中创建这个类的实例:

现在您可能想知道CreateNewDisplay方法是什么样子的:

bool MainOGLController::CreateNewDisplay(int argc, char* argv[])
{
    Display = new DisplayController(argc, argv);
    Manager = new StellarManager(&Display); // me trying to make reference to Display
                                            // to be able to use it within Manager
    //ogl code

    else return 0;
}
好的,我正在那里创建Manager,现在我们应该看看我是如何创建StellarManager类的:

class StellarManager
{
        std::vector<Stellar*> VectorManager; // objects from this vector will need to use
                                             // ptrDisplay to access Display

        DisplayController*  ptrDisplay;

        StellarManager(DisplayController&);
        void addEntity();
};
所以在这一点上,我应该有mainglcontroller的实例,其中有一个指向DisplayController和StellarController的指针,其中StellarController应该有它自己的指向同一DisplayController的指针

Manager->VectorManager[0].Draw();
现在,在某个有工作代码的地方,我称之为addEntity方法:

void StellarManager::addEntity()
{
    VectorManager.push_back(new Stellar(&ptrDisplay); // sending ptrDisplay so that the
                                                      // Stellar object can use it
}
恒星类的定义如下:

class Stellar
{

    public:
            DisplayController* ptrDisplay;
            Stellar(DisplayController**);
            void Draw(); // finally, heres where i want to use this Display pointer
};
void Stellar::Draw(int _mode)
{
    GLMatrixStack* mvm = &(ptrDisplay->modelViewMatrix);
    mvm->Scale(2, 0.5, 0.5); // Scale is a method from GLMatrixStack
}
恒星构造器:

StellarManager::StellarManager(DisplayController& _p) // me trying to do anything
{
    *ptrDisplay = _p;
}
Stellar::Stellar(DisplayController** _p)
{
    *ptrDisplay = **_p;
}
好的!这是最后一块。我现在只想简单地调用属于Stellar类的方法Draw,并使用位于MainOGLController中的Display

Manager->VectorManager[0].Draw();
哦,抽签结果是这样的:

class Stellar
{

    public:
            DisplayController* ptrDisplay;
            Stellar(DisplayController**);
            void Draw(); // finally, heres where i want to use this Display pointer
};
void Stellar::Draw(int _mode)
{
    GLMatrixStack* mvm = &(ptrDisplay->modelViewMatrix);
    mvm->Scale(2, 0.5, 0.5); // Scale is a method from GLMatrixStack
}
大家好,如果有更好的办法,我洗耳恭听。 我所做的不起作用,我可以使用Stellar类的*ptrDisplay,但什么都没有发生,所以我想我不是在使用它的引用,而是在使用它的副本


对不起,我知道这是很多代码,可能会很混乱。我只是不知道现在该怎么办…

问题似乎就在这里:

Stellar::Stellar(DisplayController** _p)
{
    *ptrDisplay = **_p;
}
您正在取消引用从未初始化的指针(
ptrDisplay
)。这会导致未定义的行为。我认为这抓住了你想要做的事情:

Stellar::Stellar(DisplayController* _p) : ptrDisplay(_p)
{

}

无需将指针传递给指向-
DisplayController
;你的
Stellar
类需要的只是一个指向
DisplayController
的指针。此外,听起来您不想取消引用
\u p
并复制它,因此简单地复制指针(通过
ptrDisplay(\u p)
)将导致
ptrDisplay
指向与
\u p
相同的对象

正如您的签名一样,您需要
新的StellarManager(*显示)