我的头文件看起来像这样
#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() {
^
我不明白为什么编译器在我之前定义它时会给出命名空间错误。
问题: 有没有办法不在源文件中重复命名空间?
答案 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
。