2

ウォーハンマー40Kアーミーカウンタープログラムを作成しようとしているので、Excelを使い続ける必要はありません。私の問題は、2つの異なるオブジェクトと、同じ変数名を持つそれらのヘッダーファイルがあるため、プログラムでエラーが発生することです。

プログラムを実行しようとすると、g ++は、変数が最初のオブジェクトですでに宣言されていると文句を言います。

これが起こらないようにするにはどうすればよいですか?

これがSKulltaker.cppプログラムのコードスニペットです

#include "SkullTaker.h"
#include <string>
int pointCost = 140;
int minSize = 1;
int maxSize = 1;
std::vector<std::string> rules;

これがSkullTaker.hです

class SkullTaker {
public:

    SkullTaker();
    SkullTaker(const SkullTaker& orig);
    int getPointCost();
    int getMinSize();
    int getMaxSize();
    std::vector<std::string> getRules();
    std::string toString();
    virtual ~SkullTaker();
};

私の他のクラスも同じですが、KuGathの.cppファイルと.hファイルの名前です。

PointCostには複数の定義があると不平を言うg++。

ありがとう、

dhoehna

4

4 に答える 4

3

「静的」キーワードを使用して、グローバル変数のスコープをその翻訳単位のみに制限する必要があることを示します。

static int pointCost = 140;

于 2012-08-16T22:29:55.780 に答える
2

「匿名」名前空間を使用します。

namespace {
int pointCost = 140;
int minSize = 1;
int maxSize = 1;
std::vector<std::string> rules;
}
//the code that uses these comes here.

その中のすべては、そのファイル内でのみ表示されます。別のオプション(クラス定義に必要な場合のみ)は、これらをクラスの静的プライベートメンバーとして含めることです。

class Skulltaker {
    public:
    ...
    private: /* I believe this initialization syntax is allowed in C++11
                otherwise, initialize them in your .cpp file
                like this: int Skulltaker::pointCost(140);*/
    static int pointCost = 140;
    static int minSize = 1;
    static int maxSize = 1;
    static std::vector<std::string> rules;
};

しかし、そのように考えてみてください。これで、(設計上の問題を除いて)可能な限りグローバルを使用しないように人々が言い続ける理由を直接体験できます。

于 2012-08-16T22:38:51.857 に答える
2

ポイントコストをグローバルにし、名前空間に属していません。クラスのメンバーにすることができます (private: int pointcost;)。次に、コンストラクターの cpp で、または pointcost=140 を設定します。これは実際には、すべてのクラスが「WarHammerUnit」と呼ばれる基本クラスから派生できるように見えるものであるため、代わりにそこのメンバーである可能性があり、コンストラクターで各ユニットに設定します。

于 2012-08-16T22:47:09.380 に答える
0

using namespace std;それが完全なファイルである場合は、インクルードの後に​​コマンドが必要です。それを修正する可能性のある名前空間の問題がある場合...すべてのコンパイラ ディレクティブ (includes、ifdefs、ect) が適切であれば、クラス内の変数名の間に競合はないはずです。

また、クラスのプロパティはヘッダー ファイルで宣言する必要があります。これら 2 つが混同されているようです (または、質問の書き方が間違っているだけかもしれません)。これらの値が定数であると想定されている場合static constは、ヘッダー ファイルのように宣言してそこで初期化できます。インスタンスごとに異なる場合は、コンストラクターで初期化する必要があります。

于 2012-08-16T22:25:27.533 に答える