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

标签 c++ compiler-errors constants header-files extern

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

我(必须)在头文件 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 值(而不是初始化它)。所以我不知道如何继续,或者我的代码有什么问题。我必须尊重两个强制性事实:
  • Functions/global-consts 定义、functions/global-consts 声明和 main 必须在上述三个文件中拆分。
  • mu 将被定义为所有三个文件共享的常量。

  • 这可能吗?如何?

    编辑:

    我认为我的问题是无法在函数内初始化 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/

    相关文章:

    c++ - 在运行时查询模板特化/避免大切换的方法

    C++结构重新定义编译器错误

    c++ - Eclipse Ubuntu 中的 “Program is not a recognized executable” 错误

    Android:android 编译时验证意向附加已通过

    python - cx_Freeze 未检测到 cv2

    c++ - 如何从 vector 中删除第一次出现的值?

    c++ - Wt 编译问题

    c - 使用浮点常量和变量的 'printf' 参数 1 的类型不兼容

    c++ - 如何在这个例子中使用 `const` ness?

    c++ - 为 const global 跳过 extern 仍然可以正常工作