繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM