首先,让我说我已经阅读了有关如何初始化全局变量或如何正确实现全局常量的类似主题。尽管如此,这些问题并没有真正帮助我解决我的具体问题,我也没有咨询过任何其他资源。问题如下。
我(必须)在头文件 header.h 中声明一个变量,该变量必须是常量,并且由 main.cpp 中的主函数以及另一个文件 functions.cpp 中定义的其他函数(之前在 header.h 中声明)使用)。问题是这个常量是一个运行时常量,它的值是由用户给定的。我应该如何进行?
我认为我最好的方法是按照以下方式进行。在 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
}
然后在functions.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
}
最后是 main.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 值(而不是初始化它)。所以我不知道如何继续,或者我的代码有什么问题。我必须尊重两个强制性事实:这可能吗?如何?
编辑:
我认为我的问题是无法在函数内初始化 exten 变量,但如果是这样,我看不出我是如何做我想做的。
最佳答案
想一想:如果需要在程序的生命周期内设置一个值,那么它并不是一个真正的常量。所以,你不应该试图通过将它声明为 const
来假装它是一个常量。 .如果您不希望程序意外更改其值,则必须以其他方式保护它,例如使其成为类的私有(private)成员变量。这样,您可以将访问限制为仅返回 mu
的值作为一个常量。
// 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;
}
关于C++:实现一个全局常量,其值由用户给出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61799647/