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