如何转发声明类中的对象? (C++)

Posted

技术标签:

【中文标题】如何转发声明类中的对象? (C++)【英文标题】:How do I forward declare an object in a class? (C++) 【发布时间】:2015-03-07 16:44:33 【问题描述】:

所以基本上,我有一个全局类和一个播放器类。它们都在它们的 ObjPlayer.h/ObjPlayer.cpp 中定义,对于全局也是如此。但是如何在 ObjGlobal 中转发声明 ObjPlayer 的实例?

这是我所拥有的:(定义构造函数,类减速在别处。)

//Create all the objects
GlobalClass::GlobalClass(void)

    //Create a player for testing
    ObjPlayer oPlayer(4, 8);

但由于它在构造函数中,我认为我不能像在主函数中那样访问该类。

int main()

    GlobalClass oGlobal();
    oGlobal.oPlayer.showVars(); //Doesn't work...

    system("PAUSE");
    return 0;

(我知道我不应该使用系统,它只是用于调试。)

我很困惑,我不知道如何解决这个问题。 (我对 C++ 很陌生,我的主要语言是 GML...)

非常感谢您对此问题的任何帮助。

【问题讨论】:

在一个类中“前向声明”一个对象是什么意思?这在 C++ 中没有多大意义。 你需要让oPlayer成为GlobalClass的成员。可以是公共的,也可以是带有 getter 的私有的。 【参考方案1】:

您正在构造函数中创建和销毁局部变量,而不是类成员。一旦构造函数完成后,它就不再存在,因此无法从外部访问它。

需要在类中声明一个类成员:

class GlobalClass 
    //...
    ObjPlayer oPlayer;
    //...
;

可以由构造函数初始化:

GlobalClass::GlobalClass() : oPlayer(4,8) 

并且(如果是公开的)根据需要访问:

GlobalClass oGlobal;   // no (), that would declare a function
oGlobal.oPlayer.showVars();

【讨论】:

【参考方案2】:

在objGlobal头文件中,类声明前添加:

class oPlayer;

【讨论】:

以上是关于如何转发声明类中的对象? (C++)的主要内容,如果未能解决你的问题,请参考以下文章

将声明的枚举转发为类成员变量

c++ 转发函数调用

c++的左值(lvalue),右值(rvalue),移动语义(move),完美转发(forward)

C++11移动构造函数详解

自动端口转发 (UPnP ?) C++

C++中的万能引用和完美转发