C++:实现一个全局常量,其值由用户给出

C++: implementing a global constant whose value is given by the user

本文关键字:用户 常量 全局 实现 一个 C++      更新时间:2023-10-16

首先,让我说我已经阅读了有关如何初始化全局变量或如何正确实现全局常量的类似线程。然而,这些问题并没有真正帮助我解决我的具体问题,也没有我咨询过的任何其他资源。问题如下。

我(必须(在头文件 header.h 中声明一个变量,该变量必须是常量并由 main 中的 main 函数使用.cpp以及在另一个文件函数中定义的其他函数.cpp(之前在 header.h 中声明(。问题是这个常量是一个运行时常量,其值由用户给出。我应该怎么做?

我认为我最好的选择是执行以下操作。在标题中。

// Header guard
namespace n
{
// Some forward declarations
extern const double mu; // The constant that should be initialized by the user.
// Some other declarations
}

然后在函数中.cpp

#include "header.h"
namespace n
{
// Some definitions here
double function_that_uses_mu(double a, double b)
{
// Some code using mu
return somedouble;
}
// Some other definitions
}

最后是主要的.cpp

#include "header.h"
#include <iostream>
int main()
{
// Some code
double value_of_mu{};
std::cin >> value_of_mu;        
// Validity check
extern const double n::mu{ value_of_mu };
// More code
return 0;
}

问题是编译失败是由于error: ‘mu’ has both ‘extern’ and initializer.但是,如果我尝试mu = value_of_mu显然会得到一个错误,因为我将分配给一个 const 值(而不是初始化它(。所以我不知道如何继续,或者我的代码有什么问题。我必须尊重两个强制性事实:

函数/全局常量
  1. 定义、函数/全局常量声明和 main 必须在上述三个文件中拆分。

  2. mu 将被定义为所有三个文件共享的常量。

这可能吗?如何?

编辑:

我认为我的问题是 exten 变量无法在函数内初始化,但如果是这样,我就不知道我该怎么做我想要做的事情。

想一想:如果需要在程序的生命周期内设置一个值,那么它并不是一个真正的常量。 因此,您不应该尝试通过将其声明为const来假装它是一个常量。 如果不希望程序意外更改其值,则必须以其他方式保护它,例如使其成为类的私有成员变量。 这样,您可以将访问限制为仅返回mu的值作为 const。

// muholder.h
class muholder
{
private:
double m_value;
public:
muholder (double ivalue): m_value(ivalue) {}
double const &value() const { return m_value; }
};
// workflow_envelope.h
class workflow_envelope
{
private:
muholder m_mu;
public:
workflow_envelope (double imu): m_mu(imu) {}
bool validity_check();
double method_that_uses_mu (double a, double b) const  { return a*m_mu.value()/ b; }
void run(); // any "more code" goes in here. 
};
// main
#include "workflow_envelope.h"
#include <iostream>
int main()
{
// Some code
double value_of_mu;
if (std::cin >> value_of_mu)
{      
// Validity check
workflow_envelope workflow(value_of_mu);
if (workflow.validity_check())
{
workflow.run();  
return 0;
}
}
return 1;
}

初始化变量时,不能指定extern。这应该可以代替:

int main()
{
// Some code
double value_of_mu{};
std::cin >> value_of_mu;        
// Validity check
using namespace n;
const double mu = value_of_mu;  // no extern specifier
// More code
return 0;
}