2013年6月3日 星期一

namespace (C++)


名稱空間(Namespace)

許多大的程式使用到Namespace,原因如下


隨著程式碼撰寫越來越多,程式內容越來越大,您會發現管理程式中的變數名稱、函式名稱、類別名稱也會是一件麻煩的事,尤其是一些同名問題的發生,例如在程 式中,您也許會定義一個Point類別代表2維空間的點,也許在程式的某個地方,您也會定義一個Point類別來表示一個3維空間的點,其它像函式同名、 共用變數同名的情況也可能發生,當這種情況發生時,其中一個定義就可能將另一個定義給覆寫掉了。

C++提供名稱空間的概念,它就像是一個管理容器,可以將您所定義的名稱區域在名稱空間之下,而不會有相互衝突的發生,例如您定義了一個 dimension2d與dimension3d的名稱空間,在它們之下都有一個Point類別,但由於屬於不同的名稱空間,所以這兩個名稱並不會有所衝突。


C++使用"namespace"關鍵字來定義一個名稱空間,其語法如下所示:

namespace 名稱 {
// 類別、函式或變數宣告
};


  • Point2D.h
namespace d2d { 
    int i, j, k; 

    class Point2D {
    public: 
        Point2D() {
            _x = 0; 
            _y = 0;
        } 
 
        Point2D(int x, int y) : _x(x), _y(y) {
        }
 
        int x() {return _x;} 
        int y() {return _y;} 
 
     private:
        int _x;
        int _y; 
    }; 
};
 
  • main.cpp
#include <iostream>
#include "Point2D.h"
using namespace std;

int main() {
d2d::Point2D p1(10, 10);

cout << "(x , y) : ("
<< p1.x() << ", "
<< p1.y() << ")"
<< endl;

return 0;
}


另一個用法
  • main.cpp
#include <iostream> 
#include "Point.h"
using namespace std; 
using d2d::Point2D; 

int main() { 
    Point2D p1(10, 10); 

    cout << "(x , y) : (" 
         << p1.x() << ", " 
         << p1.y() << ")"
         << endl; 
 
    return 0; 
} 
 
 
 
另外如果有兩個檔案有定義相同的namespace,可以定義如下
namespace config{
    extern int On;
    extern int Off;

    extern double S;
}

And in the source file:
namespace config{  
    int On = 1;  
    int Off = 0; 
    double S = 1.0; 
}


如果兩個namespace內部定義不相同的變數,則為Extending namespaces (C++ only)
參考如下

namespace X { // namespace definition
  int a;
  int b;
  }

namespace X { // namespace extension
  int c;
  int d;
  }

namespace Y { // equivalent to namespace X
  int a;
  int b;
  int c;
  int d;
  }
 
參考網站
http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fextending_namespaces.htm
 
http://openhome.cc/Gossip/CppGossip/Namespace.html


沒有留言: