[英]How to forward declare class which is in unnamed namespace
我正在尝试使用懒惰的计算创建类。 所以我需要 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'
给出了一个错误的expected type-specifier before 'PrevCalc'
,如果我定义没有命名空间的PrevCalc
一切正常。 我的问题是如何声明将在.cpp
文件中的未命名命名空间中定义的类
我的问题是如何声明将在
.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;
};
}
您还可以使用嵌套类?
#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(){}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.