首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++我误解输出参数了吗?

C++我误解输出参数了吗?
EN

Stack Overflow用户
提问于 2015-01-12 18:43:25
回答 2查看 118关注 0票数 1

我正在用DirectX构建一个非常基本的对象加载器,我决定将它的逻辑从我的程序的主要部分中分离出来,并将它放入自己的类中(可能应该是这样)。

我遇到的问题是,我的装载机需要访问一些MainWindow变量,比如DX11 SwapChain来处理帧呈现的后台缓冲区。

我对C++非常陌生,所以我不确定我在这里是否有效地使用了指针,但是如果有人能告诉我我所做的是错误的,或者建议一种更有效的方法来处理这个问题,这将是很有帮助的。

主窗口:

代码语言:javascript
复制
// 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,我应该设置什么样的指针?我是否正确地认为我应该使用一个双指针,例如,封装的类全局是对该双指针的引用。

代码语言:javascript
复制
private: 
IDXGISwapChain& loader_swapChain;

public: 
ObjectLoader::ObjectLoader( IDXGISwapChain** swapChain ) 
{
     loader_swapChain = swapChain;
}

下面的示例演示了我需要在哪里使用MainWindow的交换链。

代码语言:javascript
复制
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背景,这个指针的东西让我头疼--希望我的要求是有意义的,如果不是,请问,我会提供更多的信息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-12 18:52:02

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

我不认为指针指针是真正需要的。

你可以这样做,参考:

代码语言:javascript
复制
private: 
ID3D11SwapChain& loader_swapChain;

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

或者如果您想使用指针:

代码语言:javascript
复制
private: 
ID3D11SwapChain* loader_swapChain;

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

编辑

如果其含义是在输入后更改全局指针,则指向指针的指针是可能的解决方案。

指向指针版本的指针:

代码语言:javascript
复制
private: 
ID3D11SwapChain** loader_swapChain;

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

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

票数 2
EN

Stack Overflow用户

发布于 2015-01-12 19:12:04

代码语言:javascript
复制
// Global variables
IDXGISwapChain* g_swapChain;  // Pointer to global swap chain 

好的,到目前为止。

全球互换链是否发生了变化?也就是说,您是否曾让g_swapChain指向另一条链?或者,一旦你设置了它,它是不变的吗?

代码语言:javascript
复制
// Obj loader init example - pass the reference of global swap chain?
ObjectLoader l( &g_swapChain );

从某种意义上说,这是一个“引用”,但它不是C++“引用”(您使用的是某物的地址,所以您正在形成一个指针),所以最好避免含糊地使用引用一词。

代码语言:javascript
复制
private: 
IDXGISwapChain& loader_swapChain;

public: 
ObjectLoader::ObjectLoader( IDXGISwapChain** swapChain ) 
{
     loader_swapChain = swapChain;
}

这不可能工作,首先,这不是您设置引用成员变量的方式。引用成员必须在类mem初始化程序列表而不是中通过向它们分配一些东西来初始化。如前所述,您不初始化引用(因此它不会编译),然后尝试将某些内容分配给引用的目标(您不能“重新定位”一个引用,因此分配给一个引用不会更改它所引用的内容,它将指定给它所引用的事物)。

因此,初始化引用成员必须如下所示:

代码语言:javascript
复制
ObjectLoader::ObjectLoader( IDXGISwapChain** swapChain ) 
: loader_swapChain(swapChain)
{ }

但是,这仍然不能编译,因为您试图用指向指向某事物的指针的值来设置对某事物的引用.胡说八道,他们是完全不同的类型。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27908658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档