C ++我误解了输出参数

时间:2015-01-12 18:43:26

标签: c++ pointers directx directx-11

我正在使用DirectX构建一个非常基本的对象加载器,我决定将其逻辑与程序的主要部分分开并将其放入自己的类中(因为它应该是这样)。

我遇到的问题是我的Loader需要访问我的一些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,我会设置什么样的指针?我是否正确地认为我应该使用双指针,例如,封装类global是对该双指针的引用。

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背景,这个指针的东西给我带来了麻烦 - 希望我所要求的是有道理的,如果没有请问,我会提供更多信息。

2 个答案:

答案 0 :(得分:2)

您混合引用和指针,它将无法编译。

我认为不需要指向指针的指针。

你可以这样做,参考:

private: 
ID3D11SwapChain& loader_swapChain;

public: 
ObjectLoader::ObjectLoader( ID3D11SwapChain& swapChain ) : loader_swapChain( swapChain )
{
}

或者如果你想使用指针:

private: 
ID3D11SwapChain* loader_swapChain;

public: 
ObjectLoader::ObjectLoader( ID3D11SwapChain* swapChain ) : loader_swapChain( swapChain )
{
}

修改

如果意思是在inited之后改变全局指针,那么指针指针就是可能的解决方案。

指向指针版本的指针:

private: 
ID3D11SwapChain** loader_swapChain;

public: 
ObjectLoader::ObjectLoader( ID3D11SwapChain** swapChain ) : loader_swapChain( swapChain )
{
}

请注意,全局变量不是很好的解决方案,最好使用单例。

答案 1 :(得分:1)

// 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-initializer-list 而不是中初始化引用成员。如上所述,您不初始化引用(因此它不会编译),然后您尝试将分配给引用的目标(您无法“重新定位”引用,所以分配给一个并不会改变它所指的东西,它会分配给它引用的东西。)

因此,初始化参考成员必须像:

ObjectLoader::ObjectLoader( IDXGISwapChain** swapChain ) 
: loader_swapChain(swapChain)
{ }

然而,这仍然无法编译,因为你试图设置对具有指向某事物指针的指针值的东西的引用......这是无稽之谈,它们是完全不同的类型。

SHR的答案显示了一些正确的方法来创建引用其他内容的成员变量,以及如何正确初始化它。