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

以下是(最小)文件:

主.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

板.cc:

#include "board.h"

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

通过初始化“int board::arbi = 5;”来解决 在board.cc

问题仍然是当某物显然是一个对象时为什么要使用一个类,即使您知道该对象总会有一个实例。在我看来,您会想要全局变量,但为了避免名称冲突,您会将它们放在命名空间中。

4

2 回答 2

3

你还没有定义board::arbi。这可能是您未定义的参考。

至于namespacevs class,它们有不同的用途。Aclass为一组实例化或派生它的对象提供一组属性。Anamespace是一种提供具有公共前缀的符号集合的方法。它不是一个作用域(尽管命名空间解析有点像作用域),并且没有继承或派生自namespace.

范围有能力限制其内部名称的可见性。Anamespace不提供任何可见性隐藏超出常规变量(例如文件静态变量)可用的内容。哪里class可以创建privateprotected数据成员和方法。

于 2012-07-08T07:18:12.557 回答
3

您需要在 board.cc 文件中定义 board::arbi 。

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

使用 extern 声明,您只是安慰编译器稍后将提供定义,但您没有提供定义。

关于抽象问题,类和命名空间的概念有很大不同。类定义了“真实”对象的结构。即,它们占用内存。命名空间就像限制全局变量范围的栅栏。它们不占用内存......因此,如果您在程序中看到逻辑对象,请将它们定义为类。但是,如果您只看到一组以某种方式相关的全局函数,但您无法将它们想象为一个连贯的对象,请使用命名空间。

于 2012-07-08T07:25:36.180 回答