簡體   English   中英

為什么不能在與類定義相同的名稱空間中創建C ++類的實例?

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

我的一個朋友正在學習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;”)之后的行給出錯誤“錯誤:此聲明沒有存儲類或類型說明符”以這種方式在名稱空間中設置成員變量是非法的,還是我還缺少其他東西?

名稱空間中僅允許使用聲明。

這些

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

不是聲明。

如果需要定義全局變量PlayerStats John,則可以將成員初始化推送到構造函數中。 這樣的事情會起作用:

namespace Characters
{
    class PlayerStats
    {
    public:
        int HPMax, HPCurrent;
        PlayerStats( int hpm, int hpc ) : HPMax(hpm), HPCurrent(hpc) { }
    };
    PlayerStats John( 1, 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作為其參數的構造函數。

還有其他方法,使用“工廠方法”或靜態類初始化,但是這些方法涉及更多。 上面的內容應該可以幫助您。

像這樣做:

#include <iostream>
using namespace std;

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM