1

まず、より抽象的な質問です。コンストラクタ/デストラクタまたはそのオブジェクトの複数のコピーが必要ない場合、速度の観点から、クラスの代わりに名前空間を使用することをお勧めしますか?

次に、名前空間を含めて使用しようとすると、「 ccEaV3B0.o:main.cc:(.text+0x10): undefined reference to `board::arbi' 」が表示されます。Windows 7 で Mingw32 を使用しており、次の make コマンドを使用しています: g++ -Wall main.cc board.cc

これは、g++ -c board.cc g++ -Wall main.cc board.o を使用して、個別にコンパイルしたときにも発生します。

(最小限の)ファイルは次のとおりです。

main.cc:

#include <iostream>
using namespace std;

#include "board.h"

int main(){
    cout << board::give() << endl;
    return 0;
}

ボード.h:

#ifndef BOARD_H
#define BOARD_H

namespace board {
    extern int arbi;
    extern int give();
}

#endif

board.cc:

#include "board.h"

int board::give(){
    return arbi;
}

「int board::arbi = 5;」という初期化を与えることで解決しました。board.ccで

オブジェクトのインスタンスが常に 1 つだけ存在することがわかっている場合でも、何かが明らかにオブジェクトである場合に、なぜクラスを使用する必要があるのか​​という疑問が残ります。グローバルが必要なように思えますが、名前の衝突を避けるために、グローバルを名前空間に配置します。

4

2 に答える 2

3

board.cc ファイルで board::arbi を定義する必要があります。

 int board::arbi = <whatever initial value>;

extern 宣言を使用して、後で定義を提供することをコンパイラーに慰めただけで、定義を提供しませんでした。

抽象的な質問に関しては、クラスと名前空間の概念は大きく異なります。クラスは、「実在する」オブジェクトの構造を定義します。つまり、メモリを占有します。名前空間は、グローバル変数のスコープを制限する柵のようなものです。それらはメモリを占有しません....したがって、プログラム内に論理オブジェクトがある場合は、それらをクラスとして定義してください。しかし、なんらかの関連性があるグローバル関数のセットしか表示されず、それらを一貫したオブジェクトとして想像できない場合は、名前空間を使用してください。

于 2012-07-08T07:25:36.180 に答える
3

を定義していませんboard::arbi。それはおそらくあなたの未定義の参照です。

namespacevsに関してclassは、それらは異なる目的を果たします。classは、インスタンス化または派生するオブジェクトのグループに一連のプロパティを提供します。Anamespaceは、共通のプレフィックスを持つシンボルのコレクションを提供する方法です。これはスコープではなく (名前空間の解決はスコープのように機能しますが)、. から継承または派生することはありませんnamespace

スコープには、その中にある名前の可視性を制限する機能があります。は、通常のnamespace変数 (ファイルの静的変数など) で利用できるものを超えて隠れる可視性を提供しません。where as はメンバーとメソッドclassを作成privateまたはデータ化できます。protected

于 2012-07-08T07:18:12.557 に答える