C++我误解了输出参数

C++ am I misunderstanding output parameters

本文关键字:输出 参数 误解 C++      更新时间:2023-10-16

我正在使用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 类中,我将设置哪种指针才能不断引用我的主 Windows 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背景,这个指针的东西让我头疼 - 希望我问的是有意义的,如果没有,请问,我会提供更多信息。

混合引用和指针,它不会编译。

我不认为真的需要指针到指针。

你可以这样做

,参考:
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 )
{
}

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

// 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 的答案展示了一些创建引用其他内容的成员变量的正确方法,以及如何正确初始化它。