【问题标题】:constant member in class类中的常量成员
【发布时间】:2020-04-18 09:37:43
【问题描述】:

我有这门课:

class model
{
private:
    link_list list;
    float parameter_B1;
    float parameter_B0;
public:
    model();
    float getparameter_B1() const;
    float getparameter_B0() const;
    float predict();
    void info();
};

其中float parameter_B1float parameter_B0 是常量,但是为了初始化它们,我必须进入构造函数主体并读取一个文件并使用该文件的数据来查找这两个属性的值,但是一旦我设置了它们,他们不会再改变了。(所以我猜他们算作常数)

像这样:

model::model()
{
    char filename[300];
    cout << "enter file name(path\\filname.txt):" << endl;
    cin >> filename;
    FILE* fp;
    fp = fopen(filename, "r+");
    float x, y;
    if (fp == NULL)
    {
        cout << "Unable to open the file!" << endl;
        exit(EXIT_FAILURE);
    }
    else
    {
        while (!feof(fp))
        {
            if (fscanf(fp, "%f\t%f", &x, &y) == 2)
            {
                Pair p(x, y);
                list.insertNewNode(p);
            }
        }
    }
    Pair _average = list.average();
    parameter_B1 = list.parameters1(_average);
    parameter_B0 = list.parameters2(_average, parameter_B1);
}

但如果我将班级改为:

class model
{
private:
    link_list list;
    const float parameter_B1;
    const float parameter_B0;
public:
    model();
    const float getparameter_B1() const;
    const float getparameter_B0() const;
    float predict();
    void info();
};

我会收到这些错误“model::model()”提供没有初始化:

1.常量成员“model::parameter_B1”

2。常量成员“model::parameter_B0”

,但正如你所见,我不能使用初始化列表。

我该怎么办?不是声明常量变量是我唯一的解决方案吗?

【问题讨论】:

  • 你不能分配给const变量,但你可以初始化它们,在你的情况下你也不能初始化它们,因为变量的值取决于关于外部运行时间因素。
  • 我想到了工厂模式。您可以在另一个函数/类中读取文件并将参数作为参数提供给model 构造函数。
  • 在另外几个不相关的注释中,首先请不要在构造函数中做太多事情。构造函数应该将成员变量初始化为合理的默认状态,而不是更多。如果要从文件中读取,则创建一个在构造后调用的函数。另外请不要使用旧的 C 样式 I/O(fopen 和朋友)。最后请阅读Why is “while ( !feof (file) )” always wrong?
  • 返回 const float 是没用的顺便说一句。
  • 既然他们是私人的,你为什么要关心?该类的任何用户都无法更改变量,因为您没有提供任何这样做的机制,因此只需记录它们是有效的常量,然后保留它。

标签: c++ initialization constants initializer-list


【解决方案1】:

使用委托构造函数,您可能会这样做

std::tuple<link_list, float, float> read_model_file()
{
    char filename[300];
    cout << "enter file name(path\\filname.txt):" << endl;
    cin >> filename;
    // ...
    Pair _average = list.average();
    parameter_B1 = list.parameters1(_average);
    parameter_B0 = list.parameters2(_average, parameter_B1);
    return {std::move(list), parameter_B0, parameter_B1};
}

class model
{
private:
    link_list list;
    const float parameter_B0;
    const float parameter_B1;
public:
    model() : model(read_model_file()) {}
    model(std::tuple<link_list, float, float> t) :
        list(std::get<0>(std::move(t))),
        parameter_B0(std::get<1>(std::move(t))),
        parameter_B1(std::get<2>(std::move(t)))
    {}
    // ...
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2013-05-11
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多