如何转发声明未命名的命名空间

时间:2015-10-21 19:41:00

标签: c++

我正在尝试使用延迟计算创建类。所以我需要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文件

中的未命名命名空间中定义的类

2 个答案:

答案 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(){}