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

How to not use class namespace prefix in C++ source files?

本文关键字:空间 前缀 何不使 源文件      更新时间:2023-10-16

我的标题文件看起来像

#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() {
 ^

我不明白为什么编译器之前定义名称空间的错误。

问题:是否有一种方法不重复源文件中的名称空间?

编译器需要知道在何处对应类声明。

您刚刚在文件" 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)

关于使用命名空间...我认为对您阅读此书会有所帮助(即使实际上无法实际实现类别定义),为什么使用"使用命名空间std"被认为不良练习?

using namespace NormalClient;是错误的原因。正常人是类,而不是名称空间。您无需使用using namespace来使用常规标题,而必须使用点运算符,例如:NormalClient.something创建类的实例并在其中访问其中的内容。