为什么无法创建在与类定义相同的命名空间中定义的 C++ 类的实例?

Why Can't I create an instance of a C++ class defined in the same namespace as the class definition?

本文关键字:定义 命名空间 C++ 实例 为什么 创建      更新时间:2023-10-16

我的一个朋友正在学习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;"answers"字符::John.HPMmax=1;")给出错误"错误:此声明没有存储类或类型说明符"以这种方式在命名空间内设置成员变量是违法的,还是我缺少了其他东西?

命名空间内只允许声明。

这些

 John.HPMax = 1;
 Characters::John.HPMax = 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作为参数的构造函数。

还有其他方法,使用"工厂方法"或静态类初始化,但这些方法涉及更多。以上内容应该会让你现在就行动起来。

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

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

这样做:

#include <iostream>
using namespace std;
namespace Characters
{
    class PlayerStats
        {
        public:
            int HPMax, HPCurrent;
        };
}
int main( void )
{
    Characters::PlayerStats John;
    John.HPMax = 1;
    return 0;
}