如何创建外部不可修改的变量?

koc*_*ica 4 c++ code-design

我正在开发简单的模拟库并遇到问题,我有模拟Time变量,在任何情况下都不能由API用户(程序员)修改(只提供有关模拟时间的信息),但应该可以通过模拟库进行修改,所以它不能是恒定的.

这是我想出来的,但对我来说似乎有点棘手

double simTime;                // Internal time, modified by library
const double& Time = simTime;  // Time info provided for programmer in API
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

Geo*_*nov 10

而不是const double &你可以改变你的API来提供一个double getTime();返回值的函数simTime.

  • @FilipKočica尝试使用该功能进行基准测试,在避免它之前不要看它是否有任何负面影响:过早优化等. (5认同)
  • 也许.足够聪明的编译器可以内联或以其他方式消除它. (3认同)
  • @Galik它无法在API标头中内联,因为实现将在库中.否则,如果您将内联实现放在标头中,这意味着您可以访问标头中的变量(即来自用户代码),这会破坏首先封装它的目的. (3认同)
  • @Galik Linkage. (3认同)
  • 同意.即使这意味着执行该功能需要一些额外的时间,这在设计和分离方面也更好. (2认同)

Ste*_*ner 5

我觉得const double&-solution很简单,很优雅,我没有看到任何负面的副作用.

唯一的问题是你的库应该声明simTimestatic匿名命名空间,或者在匿名命名空间中声明它不能从外部寻址.否则,任何extern double simTime其他翻译单元中的任何一个都将公开simTime.

所以写...

// library.cpp:
static double simTime;
const double &simTimePublic = simTime;

// library.h:
extern const double &simTimePublic;

// userCode.cpp:
#include "library.h"
...
double simTimeCopy = simTimePublic;

// simTimePublic = 1.0; // illegal
Run Code Online (Sandbox Code Playgroud)