我正在用DirectX构建一个非常基本的对象加载器,我决定将它的逻辑从我的程序的主要部分中分离出来,并将它放入自己的类中(可能应该是这样)。
我遇到的问题是,我的装载机需要访问一些MainWindow变量,比如DX11 SwapChain来处理帧呈现的后台缓冲区。
我对C++非常陌生,所以我不确定我在这里是否有效地使用了指针,但是如果有人能告诉我我所做的是错误的,或者建议一种更有效的方法来处理这个问题,这将是很有帮助的。
主窗口:
// Global variables
IDXGISwapChain* g_swapChain; // Pointer to global swap chain
// Obj loader init example - pass the reference of global swap chain?
ObjectLoader l( &g_swapChain );
// Condensed method call as you don't need to see all parameters
loader.__loadModel("model.obj");现在,在我的ObjectLoader类中,为了能够不断地引用我的主g_swapChain,我应该设置什么样的指针?我是否正确地认为我应该使用一个双指针,例如,封装的类全局是对该双指针的引用。
private:
IDXGISwapChain& loader_swapChain;
public:
ObjectLoader::ObjectLoader( IDXGISwapChain** swapChain )
{
loader_swapChain = swapChain;
}下面的示例演示了我需要在哪里使用MainWindow的交换链。
ObjectLoader::__loadModel(std::string fielname)
{
if (modelLoaded)
...
else {
// this is an example of where I want to use the swap chain in MainWindow
loader_swapChain->SetFullscreenState(false, NULL);
}
}来自Java背景,这个指针的东西让我头疼--希望我的要求是有意义的,如果不是,请问,我会提供更多的信息。
发布于 2015-01-12 18:52:02
如果混合引用和指针,它将不会编译。
我不认为指针指针是真正需要的。
你可以这样做,参考:
private:
ID3D11SwapChain& loader_swapChain;
public:
ObjectLoader::ObjectLoader( ID3D11SwapChain& swapChain ) : loader_swapChain( swapChain )
{
}或者如果您想使用指针:
private:
ID3D11SwapChain* loader_swapChain;
public:
ObjectLoader::ObjectLoader( ID3D11SwapChain* swapChain ) : loader_swapChain( swapChain )
{
}编辑
如果其含义是在输入后更改全局指针,则指向指针的指针是可能的解决方案。
指向指针版本的指针:
private:
ID3D11SwapChain** loader_swapChain;
public:
ObjectLoader::ObjectLoader( ID3D11SwapChain** swapChain ) : loader_swapChain( swapChain )
{
}注意,全局变量不是很好的解决方案,最好使用单例。
发布于 2015-01-12 19:12:04
// Global variables
IDXGISwapChain* g_swapChain; // Pointer to global swap chain 好的,到目前为止。
全球互换链是否发生了变化?也就是说,您是否曾让g_swapChain指向另一条链?或者,一旦你设置了它,它是不变的吗?
// Obj loader init example - pass the reference of global swap chain?
ObjectLoader l( &g_swapChain );从某种意义上说,这是一个“引用”,但它不是C++“引用”(您使用的是某物的地址,所以您正在形成一个指针),所以最好避免含糊地使用引用一词。
private:
IDXGISwapChain& loader_swapChain;
public:
ObjectLoader::ObjectLoader( IDXGISwapChain** swapChain )
{
loader_swapChain = swapChain;
}这不可能工作,首先,这不是您设置引用成员变量的方式。引用成员必须在类mem初始化程序列表而不是中通过向它们分配一些东西来初始化。如前所述,您不初始化引用(因此它不会编译),然后尝试将某些内容分配给引用的目标(您不能“重新定位”一个引用,因此分配给一个引用不会更改它所引用的内容,它将指定给它所引用的事物)。
因此,初始化引用成员必须如下所示:
ObjectLoader::ObjectLoader( IDXGISwapChain** swapChain )
: loader_swapChain(swapChain)
{ }但是,这仍然不能编译,因为您试图用指向指向某事物的指针的值来设置对某事物的引用.胡说八道,他们是完全不同的类型。
SHR的答案显示了一些正确的方法来创建引用其他内容的成员变量,以及如何正确地初始化它。
https://stackoverflow.com/questions/27908658
复制相似问题