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