如何不使用C 源文件中的类名称空间前缀
How to not use class namespace prefix in C++ source files?
我的标题文件看起来像
#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
创建类的实例并在其中访问其中的内容。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- QXmlStreamWriter,命名空间和前缀
- 有没有办法在不使用命名空间 std 或前缀 std:: 的情况下引用 cout?
- 自定义提升前缀/命名空间 - 如何使用
- 如何避免GDB中符号的命名空间前缀?
- 如何不使用C 源文件中的类名称空间前缀
- connect() 似乎用错误的命名空间作为信号的前缀
- 具有前缀映射和不带前缀映射的 Pugiparse 命名空间
- 在命名空间前缀解析和优化级别依赖关系中使用外部"C" C++
- 使用 std 命名空间,为什么(或为什么不)我应该在 std:: 前面加上前缀
- 为什么命名空间中的某些函数可以在没有命名空间范围前缀的情况下访问
- 在 CPP 文件中使用命名空间作为函数定义的前缀是否是一种好的做法
- 在C++命名空间中,当在头中声明的非成员子例程前面加前缀时,“static”限定符是否有任何作用
- 为什么某些 Boost 函数不需要以命名空间为前缀
- schemaLocation的libxml2名称空间前缀没有定义
- 我想从这段代码中删除使用命名空间std,但我不确定什么都需要用std::作为前缀