如何在C ++源文件中不使用类名称空间前缀?

时间:2017-12-03 03:54:28

标签: 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() {
 ^

我不明白为什么编译器在我之前定义它时会给出命名空间错误。

问题: 有没有办法不在源文件中重复命名空间?

2 个答案:

答案 0 :(得分:2)

编译器需要知道对应于类声明的定义。

您刚刚在文件&#34; ClientType.h&#34;中声明了该类。 另一方面,您需要定义类,它将正常位于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 :(得分:1)

using namespace NormalClient;是导致错误的原因。 NormalClient是一个类,而不是命名空间。您不必使用using namespace来使用NormalClient标头,您必须使用点运算符创建类的实例并访问内部,例如:NormalClient.something