为什么我不能创建与类定义在同一名称空间中定义的C ++类的实例?

时间:2013-08-25 16:44:22

标签: c++ class namespaces

我的一位朋友正在研究学习C ++,我一直在帮助他。我们都使用Visual Studio 2010。

以下代码给出了错误:

#include <iostream>
using namespace std;

namespace Characters
{
    class PlayerStats
        {
        public:
            int HPMax, HPCurrent;
        };
    PlayerStats John;
    John.HPMax = 1;
    Characters::John.HPMax = 1;
}

“PlayerStats John”这一行似乎解决得很好,但后面的行 (“John.HPMax = 1;”和“Characters :: John.HPMax = 1;”) 给出错误“错误:此声明没有存储类或类型说明符” 以这种方式在命名空间中设置成员变量是不合法的还是我还缺少其他东西?

4 个答案:

答案 0 :(得分:3)

只允许在名称空间内声明。

这些

 John.HPMax = 1;
 Characters::John.HPMax = 1;

不是声明。

答案 1 :(得分:1)

如果需要定义全局变量PlayerStats John,可以将成员初始化推送到构造函数中。像这样的东西会起作用:

namespace Characters
{
    class PlayerStats
    {
    public:
        int HPMax, HPCurrent;
        PlayerStats( int hpm, int hpc ) : HPMax(hpm), HPCurrent(hpc) { }
    };
    PlayerStats John( 1, 1 );
}

答案 2 :(得分:1)

赋值语句仅允许在函数中使用(包括构造函数或析构函数作为特殊类型的函数)。大多数“可执行”语句都是如此。名称空间对此无关紧要。没有它们,或者在类或结构内部(但不在内联函数体中),这些赋值将是非法的。

只允许在函数之外声明,因此如果需要初始化John实例的那些成员,那么必须使用某种初始化程序。

由于类(到目前为止)只有公共数据成员而没有构造函数或虚方法,因此可以使用带有支撑列表的成员初始化:

PlayerStats John = {2, 1}; // sets HPMax=2 and HPCurrent=1

这种类通常被描述为结构,通常仅用于非常小的简单对象。数据成员按声明的顺序初始化。

更面向对象的方法是使用构造函数。 :

class PlayerStats
{
public:
    int HPMax, HPCurrent;
    PlayerStats(int max) : HPMax(max), HPCurrent(max) {}
};

// define an instance of PlayerStats, with max HP of 1:
PlayerStats John(1);

如果你有或者可以定义一个接受初始化所需信息的构造函数,那么它是有效的。你不能让两个不同的构造函数采用相同数量和类型的参数,因此构造函数必须是唯一一个只接受一个int作为其参数的构造函数。

还有其他方法,使用“工厂方法”或静态类初始化,但更多涉及。以上内容应该让你现在开始。

答案 3 :(得分:0)

这样做:

#include <iostream>
using namespace std;

namespace Characters
{
    class PlayerStats
        {
        public:
            int HPMax, HPCurrent;
        };
}

int main( void )
{
    Characters::PlayerStats John;
    John.HPMax = 1;
    return 0;
}