如何使变量隐藏在头文件中

问题描述 投票:0回答:1
  • 我有一个模板结构
    Distance
    ,它使用
    constexpr unsigned char mm2cm = 10
  • 由于
    Distance
    是一个模板类,我必须在头文件中定义
    mm2cm
    Distance
  • 该头文件包含在cpp文件中。
  • 我希望
    bar
    仅在此头文件中可见,而不是在包含此头文件的 cpp 文件中可见,即
//Distance.hpp

constexpr unsigned char mm2cm = 10;

template <typename UnitType>
struct Distance{
    UnitType mm;
    UnitType convToCm() const { return mm2cm * mm; }
};

//Main.cpp
#include <Distance.hpp>
#include <iostream>

int main(){
    //I do not want to be able to use mm2mm outside Distance.hpp, as follows
    std::cout << (int)mm2cm << std::endl; 
    
}

我可以在头文件的开头和结尾使用

#define mm2cm 10
#undef mm2cm
来解决这个问题(而不是
constexpr unsigned char mm2cm = 10

一般来说,const关键字是定义常量的首选,应该使用const关键字来代替#define。

解决此问题的另一种方法是使

mm2cmm
成为
Distance
的私有静态成员。

  • 但是,在我试图解决的实际更大问题中,我有多个变量,我只想在这个头文件中可见,并且将它们全部设为私有静态成员将使我的类看起来很丑陋
  • (换句话说我一定有比解决方案更好的方法)

如果有人能为我提供最优化的方法来确保

mm2cm
仅对
Distance
可见或仅在此头文件中可见

,我将不胜感激
c++ compilation header-files data-hiding
1个回答
0
投票

试试这个:

#ifndef DISTANCE_HPP
#define DISTANCE_HPP

namespace {
    constexpr unsigned char mm2cm = 10; // Only visible within this header file
}

template <typename UnitType>
struct Distance {
    UnitType mm;
    UnitType convToCm() const { return mm * mm2cm; }
};

#endif // DISTANCE_HPP
© www.soinside.com 2019 - 2024. All rights reserved.