2017-12-03 18 views
0

私はこのC++ソースファイルでクラス名前空間接頭辞を使用しない方法は?

#ifndef NORMALCLIENT_H 
#define NORMALCLIENT_H 

#include <ClientType.h> 

class NormalClient : public ClientType { 
public: 
    NormalClient(); 
    NormalClient(const NormalClient& orig); 
    double getDiscount(); 
    int getMaxRents(); 
    virtual ~NormalClient(); 
private: 

}; 

#endif /* NORMALCLIENT_H */ 

とソースファイルのように見える私のヘッダファイルがあります。

#include "NormalClient.h" 

NormalClient::NormalClient() { 
} 

NormalClient::NormalClient(const NormalClient& orig) { 
} 

NormalClient::~NormalClient() { 
} 

は、ソースファイルでNormalClient::を繰り返していないの方法はありますか?

#include "NormalClient.h" 

using namespace NormalClient 

NormalClient() { 
} 

NormalClient(const NormalClient& orig) { 
} 

~NormalClient() { 
} 

をしかし、それはコンパイル時に私にエラーを与える:: 私が試した私が前にそれを定義するとき、コンパイラは、名前空間のエラーを与える理由

/home/grayrattus/projekt/trunk/trunk/biblioteka/src/model/client_types/NormalClient.cpp:3:17: error: ‘NormalClient’ is not a namespace-name 
using namespace NormalClient 
       ^
/home/grayrattus/projekt/trunk/trunk/biblioteka/src/model/client_types/NormalClient.cpp:5:1: error: expected namespace-name before ‘NormalClient’ 
NormalClient() { 
^ 

私は理解していません。

質問: ソースファイルに名前空間を繰り返さない方法はありますか?

+4

NormalClientが名前空間ではありません(クラス定義を実装するために、実際に使用することはできませんが)役に立つことと思いますその言葉で、あなたはそれらの機能がそのクラスの方法であることを示しています。 – eyllanesc

+1

繰り返すのは、クラス名であり、名前空間名ではありません。冗長性を減らすために、コンストラクタとデストラクタの定義を除いて型のエイリアスを使用できます。最近のC++では、 'using'ディレクティブで型エイリアスを定義していますが、C++では' typedef'を使用しています。 –

答えて

2

コンパイラは、クラス宣言に対応する定義がどこにあるかを知る必要があります。

クラス "ClientType.h"でクラスを宣言しました。 一方、クラスを定義する必要があり、通常はcppファイルに配置されます。

(宣言と定義については、https://stackoverflow.com/a/1410632/9043064を参照してください)

あなたがソースコードを繰り返すことに減らしたい場合は、あなたは自分のヘッダファイルでクラスを定義することができますが

class NormalClient : public ClientType { 
public: 
    NormalClient() { // implementation } 
    NormalClient(const NormalClient& orig) { // implementation } 
    double getDiscount() { // implementation } 
    int getMaxRents() { // implementation } 
    virtual ~NormalClient() { // implementation } 
private: 

}; 

しかし、それはそれで推奨されていませんヘッダーファイルが大きくなっています。それは建物の時間を増やすことができます。また、それは良い習慣でもありません。 (https://stackoverflow.com/a/333964/9043064

名前空間の使用について...私は、あなたがこれを読んですることがWhy is "using namespace std" considered bad practice?

1

using namespace NormalClient;が原因です。 NormalClientはクラスであり、名前空間ではありません。 using namespaceを使用してNormalClientヘッダーを使用する必要はありません。ドット演算子を使用してクラスのインスタンスを作成し、内部にアクセスする必要があります(例:NormalClient.something)。

+0

だから私はいつも 'NormalClient ::'をソースコード内で繰り返す必要があり、それをクリーナーにする方法がないのですか?これは、@ eyllanescのような 'NormalClient'が、あなたがそれらの関数がclass_のメソッドであることを示しているという単語を書いたからです。 –

関連する問題