C ++我误解了输出参数吗
C++ am I misunderstanding output parameters
我正在使用 DirectX 构建一个非常基本的对象加载器,我决定将它的逻辑从我的程序的主要部分中分离出来,并将其放入自己的 class(它可能应该是这样) .
我遇到的问题是我的 Loader 需要访问我的一些 MainWindow 变量,例如 DX11 SwapChain
来处理帧渲染的后备缓冲区。
我是 C++ 的新手,所以我不确定我是否在这里有效地利用了指针,但是如果有人能告诉我我在做什么是错的或者可能会提出更多建议,那将会很有帮助处理问题的有效方法。
主要Window:
// 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 class 中,我应该设置什么样的指针才能不断引用我的 Main Windows g_swapChain
?我认为我应该使用双指针是否正确,例如,封装的 class 全局是对该双指针的引用。
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 );
从某种意义上说,这是一个 "reference",但它不是 C++ "reference"(你正在获取某物的地址,所以你正在形成一个指针)所以最好避免模棱两可地使用术语引用。
private:
IDXGISwapChain& loader_swapChain;
public:
ObjectLoader::ObjectLoader( IDXGISwapChain** swapChain )
{
loader_swapChain = swapChain;
}
这不可能行得通,首先,这不是您设置引用成员变量的方式。引用成员必须在 class mem-initializer-list not 中通过给它们赋值来初始化。正如所写,你没有初始化引用(所以它不会编译)然后你尝试将一些东西分配给引用的目标(你不能"re-seat"一个引用,所以分配给一个不会改变它所指的,它分配给它所指的东西)。
因此必须像这样初始化引用成员:
ObjectLoader::ObjectLoader( IDXGISwapChain** swapChain )
: loader_swapChain(swapChain)
{ }
但是这仍然无法编译,因为您试图设置对事物的引用,其值是指向事物的指针的指针……这是胡说八道,它们是完全不同的类型。
SHR 的回答显示了一些创建引用其他内容的成员变量的正确方法,以及如何正确初始化它。
我正在使用 DirectX 构建一个非常基本的对象加载器,我决定将它的逻辑从我的程序的主要部分中分离出来,并将其放入自己的 class(它可能应该是这样) .
我遇到的问题是我的 Loader 需要访问我的一些 MainWindow 变量,例如 DX11 SwapChain
来处理帧渲染的后备缓冲区。
我是 C++ 的新手,所以我不确定我是否在这里有效地利用了指针,但是如果有人能告诉我我在做什么是错的或者可能会提出更多建议,那将会很有帮助处理问题的有效方法。
主要Window:
// 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 class 中,我应该设置什么样的指针才能不断引用我的 Main Windows g_swapChain
?我认为我应该使用双指针是否正确,例如,封装的 class 全局是对该双指针的引用。
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 );
从某种意义上说,这是一个 "reference",但它不是 C++ "reference"(你正在获取某物的地址,所以你正在形成一个指针)所以最好避免模棱两可地使用术语引用。
private:
IDXGISwapChain& loader_swapChain;
public:
ObjectLoader::ObjectLoader( IDXGISwapChain** swapChain )
{
loader_swapChain = swapChain;
}
这不可能行得通,首先,这不是您设置引用成员变量的方式。引用成员必须在 class mem-initializer-list not 中通过给它们赋值来初始化。正如所写,你没有初始化引用(所以它不会编译)然后你尝试将一些东西分配给引用的目标(你不能"re-seat"一个引用,所以分配给一个不会改变它所指的,它分配给它所指的东西)。
因此必须像这样初始化引用成员:
ObjectLoader::ObjectLoader( IDXGISwapChain** swapChain )
: loader_swapChain(swapChain)
{ }
但是这仍然无法编译,因为您试图设置对事物的引用,其值是指向事物的指针的指针……这是胡说八道,它们是完全不同的类型。
SHR 的回答显示了一些创建引用其他内容的成员变量的正确方法,以及如何正确初始化它。