C++ 如何在C++;源文件?

C++ 如何在C++;源文件?,c++,C++,我的头文件如下所示 #ifndef NORMALCLIENT_H #define NORMALCLIENT_H #include <ClientType.h> class NormalClient : public ClientType { public: NormalClient(); NormalClient(const NormalClient& orig); double getDiscount(); int getMaxRents

我的头文件如下所示

#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 */
有没有办法不在源文件中重复
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() {
 ^
我不明白为什么我以前定义名称空间时编译器会给出名称空间的错误

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

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

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

编译器需要知道与类声明相对应的定义在哪里

您刚刚在文件“ClientType.h”中声明了该类。 另一方面,您需要定义类,它通常位于cpp文件中

(关于声明和定义,请参阅)

若您想减少重复的源代码,那个么您可以在头文件中定义类

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

};
但不建议在头文件越来越大的情况下使用。这可能会增加建筑时间。而且这也不是一个好的做法。 ()


关于使用命名空间。。。我认为阅读这篇文章会对您有所帮助(尽管实际上不可能使用它来实现类定义)

编译器需要知道与类声明相对应的定义在哪里

您刚刚在文件“ClientType.h”中声明了该类。 另一方面,您需要定义类,它通常位于cpp文件中

(关于声明和定义,请参阅)

若您想减少重复的源代码,那个么您可以在头文件中定义类

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

};
但不建议在头文件越来越大的情况下使用。这可能会增加建筑时间。而且这也不是一个好的做法。 ()


关于使用命名空间。。。我认为阅读这篇文章会对您有所帮助(尽管实际上不可能使用它来实现类定义)

NormalClient不是名称空间,您用这个词表示这些函数是类的方法。您重复的是类名,而不是名称空间名。为了减少冗长,可以对类型使用别名,构造函数和析构函数定义除外。在现代C++中,通过< <代码> >使用< /Cult>指令定义类型别名,而在C++ 03和C中,使用“代码”> TyPulfF。NormalClient不是命名空间,用这个词表示这些函数是类的方法。重复的是类名,而不是命名空间名称。为了减少冗长,可以对类型使用别名,构造函数和析构函数定义除外。在现代C++中,通过< <代码> >使用< /Cult>指令定义类型别名,而在C++ 03和C中,使用“代码> TyPulf< /Cord>”,因此我需要在代码中重复<代码>正常客户端::/COD>一直以来,没有办法使它更干净吗?这是因为
NormalClient
正如@eyllanesc用这个词写的那样,你是在表明这些函数是类的方法?所以我需要在源代码中一直重复
NormalClient::
,没有办法让它更干净?这是因为@eyllanesc用这个词写的
NormalClient
,您是在表明这些函数是类的方法吗?
class NormalClient : public ClientType {
public:
    NormalClient() { // implementation }
    NormalClient(const NormalClient& orig) { // implementation }
    double getDiscount() { // implementation }
    int getMaxRents() { // implementation }
    virtual ~NormalClient() { // implementation }
private:

};