C++ 如何转发未命名命名空间中的声明类
我正在尝试创建一个具有惰性计算的类。所以我需要struct来保存以前计算的变量,并且我想将该类放入未命名的名称空间(不想污染全局范围)。下面是解释我想要什么的最基本代码:C++ 如何转发未命名命名空间中的声明类,c++,C++,我正在尝试创建一个具有惰性计算的类。所以我需要struct来保存以前计算的变量,并且我想将该类放入未命名的名称空间(不想污染全局范围)。下面是解释我想要什么的最基本代码: 计算器.h: #ifndef CALCULATOR_H #define CALCULATOR_H class PrevCalc; class Calculator { public: Calculator(); PrevCalc* prevCalc; }; #endif // CALCULATOR_H c
计算器.h
:
#ifndef CALCULATOR_H
#define CALCULATOR_H
class PrevCalc;
class Calculator
{
public:
Calculator();
PrevCalc* prevCalc;
};
#endif // CALCULATOR_H
calculator.cpp
:
#include "calculator.h"
namespace{
struct PrevCalc{
double prevA = -1;
double prevB = -1;
double prevC = -1;
};
}
Calculator::Calculator()
{
prevCalc = new PrevCalc();
}
当然,它在'PrevCalc'之前给出了一个错误预期的类型说明符
,如果我在没有命名空间的情况下定义PrevCalc
,一切正常。我的问题是如何声明将在.cpp
文件的未命名命名空间中定义的类
我的问题是如何声明将在.cpp
文件的未命名命名空间中定义的类
你不能。未命名的名称空间显式意味着对于它出现在其中的当前转换单元是私有可见的,并且不能用于转发声明
如果您想隐藏实现细节,那么最好使用
另一种流行的方法是使用
内部
名称空间,并记录它并非用于公共
用途:
namespace calculators {
namespace internal_ {
struct PrevCalc{
double prevA = -1;
double prevB = -1;
double prevC = -1;
};
}
class Calculator {
public:
Calculator();
private: // !!!!
internal_::PrevCalc* prevCalc;
};
}
您还可以使用嵌套类
\ifndef计算器
#定义计算器
类计算器{
公众:
计算器();
~Calculator();//需要显式析构函数才能使用std::unique\u ptr
私人:
结构预测;
std::唯一\u ptr prevCalc;
};
#endif//计算器
在.cc文件中
#包括“calculator.h”
结构计算器::PrevCalc{
双普雷瓦=-1;
双prevB=-1;
双prevC=-1;
};
计算器::计算器():
prevCalc(std::make_unique())
{}
计算器::~Calculator(){}
头中的匿名命名空间肯定是错误的设计。匿名命名空间旨在将作用域限制在文件作用域内。命名名称空间可能更适合您的需要。为什么不将PrevCalc
作为计算器的嵌套结构?您也不需要动态分配它。@Dieter Lücking匿名头在中。cpp
不在header@Neil柯克以前的prev
变量是类成员,因此类太大。所以,如果我创建嵌套结构类,它将保持较大的规模。问题是,只有匿名名称空间才能提供内部链接。很遗憾,如果没有黑客攻击,就无法自由使用完全内部的类成员(或成员函数)。希望模块能改善这一点!至少我们会有模块内部类等等。