C++我误解了输出参数
C++ am I misunderstanding output parameters
我正在使用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 的答案展示了一些创建引用其他内容的成员变量的正确方法,以及如何正确初始化它。
- C++输出参数与返回值
- C++函子作为函数的输出参数
- 将ctypes c_void_p强制转换为c输出参数
- 用输出参数包装一个c++函数,以便在javascript/node中使用
- 我可以将函数的输出参数存储到unique_ptr中吗?
- 在存在错误代码的情况下输出参数与 NRVO
- 具有输出参数的QT InvoKeMethod调用函数
- 将具有std ::向量的C 函数称为Julia的输入和输出参数
- jni jiniArray 作为输出参数不会更改参数的值
- 返回容器时删除输出参数
- 通过 API 填写"std::optional"<T>,获取输出"T*"参数
- 指针或局部变量,用于函数的输出参数
- 如何在输出参数中使用基类
- 值语义与具有大数据结构的输出参数
- 当输出参数是类时,如何在C++中调用COM方法
- 如何在不破坏现有代码的情况下将输出参数添加到功能
- stl数据结构的堆栈上输出参数与返回值的效率
- C# P/调用:本机输出参数值不会到达托管代码
- 在 C++11 中将结构作为输出参数传递
- 将字符串从 C# 方法返回到输出参数中的C++函数