我正在尝试使用延迟计算创建类。所以我需要struct来保存以前计算过的变量,我想将该类放入未命名的命名空间(不要污染全局范围)。这是解释我想要的最小代码:
calculator.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();
}
当然它会给出错误expected type-specifier before 'PrevCalc'
,如果我定义PrevCalc
没有命名空间,一切正常。我的问题是如何声明将在.cpp
文件
答案 0 :(得分:6)
我的问题是如何声明将在
.cpp
文件中的未命名命名空间中定义的类
你做不到。未命名的命名空间明确地表示对于它出现的当前转换单元是私有可见的,并且不能用于本身的前向声明。
如果你想隐藏实现细节,你可能最好使用pimpl idiom。
另一种流行的方法是使用internal_
命名空间,并记录它不适用于public
用法:
namespace calculators {
namespace internal_ {
struct PrevCalc{
double prevA = -1;
double prevB = -1;
double prevC = -1;
};
}
class Calculator {
public:
Calculator();
private: // !!!!
internal_::PrevCalc* prevCalc;
};
}
答案 1 :(得分:1)
您还可以使用嵌套类吗?
#ifndef CALCULATOR_H
#define CALCULATOR_H
class Calculator {
public:
Calculator();
~Calculator(); // need an explicit destructor to use std::unique_ptr<>
private:
struct PrevCalc;
std::unique_ptr<PrevCalc> prevCalc;
};
#endif // CALCULATOR_H
在.cc文件中
#include "calculator.h"
struct Calculator::PrevCalc{
double prevA = -1;
double prevB = -1;
double prevC = -1;
};
Calculator::Calculator():
prevCalc(std::make_unique<PrevCalc>())
{}
Calculator::~Calculator(){}