2017-12-03 82 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++ 03和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'写了_with这个词,你表明这些函数是class_的方法? –

相关问题