【问题标题】:Passing a variable by reference to another class通过引用另一个类来传递变量
【发布时间】:2012-05-22 09:05:07
【问题描述】:

我试图通过引用另一个类来传递一个变量,但我无法让它工作。

我在主应用程序中创建了一些配置对象,然后当我运行配置对话框时,我想将此配置对象提供给对话框。

这是我目前所拥有的:

ConfigDialog.h

class ConfigDialog {

public:
    explicit ConfigDialog(kimai::Config& config, QWidget *parent = 0);

private:
    kimai::Config& config_;
};

ConfigDialog.cpp

ConfigDialog::ConfigDialog(kimai::Config& config, QWidget *parent) {        
    config_ = config;
    // Do something with config_ - get/set values, etc.
}

当我尝试编译时,我收到以下错误:

ConfigDialog.cpp:7: error: C2758: 'ConfigDialog::config_' : must be initialized in constructor base/member initializer list

知道如何解决这个问题吗?

(我尝试将config_ = config 添加到初始化列表中,但这无效)

【问题讨论】:

    标签: c++ class reference


    【解决方案1】:

    你不能通过赋值来初始化一个引用,它需要在初始化列表中完成:

    ConfigDialog::ConfigDialog(kimai::Config& config, QWidget *parent) : config_(config) {        
        // Do something with config_ - get/set values, etc.
    }
    

    config_ = config 赋值是赋值运算符对config 引用的值调用config_ 引用的变量,该变量未初始化。赋值语法只有在与声明结合时才有效:

    int y = 5;
    int &x = y;    // This works
    int &z; z = y; // This does not work!
    int w = 4;
    x = y;         // This is an assignment to y through a reference
    

    【讨论】:

      【解决方案2】:

      你应该使用初始化列表来初始化一个引用:

      ConfigDialog::ConfigDialog(kimai::Config& config, QWidget *parent) 
              : config_(config)
      {        
          // Do something with config_ - get/set values, etc.
      }
      

      【讨论】:

        【解决方案3】:

        你必须使用构造函数初始化列表:

        ConfigDialog::ConfigDialog(kimai::Config& config, QWidget *parent)
            : config_(config)
        {
        }
        

        【讨论】:

        • 但是config_(config) 不会创建config 的副本吗?
        • @Laurent 不,它只是复制您想要的 reference
        【解决方案4】:

        错误信息告诉你一切。试试这个:

        ConfigDialog::ConfigDialog(kimai::Config& config, QWidget *parent) 
           :config_(config)
        {           
            // Do something with config_ - get/set values, etc.
        }
        

        引用类型的类成员必须在initialization lists中初始化。

        【讨论】:

          【解决方案5】:

          您应该使用构造函数语法将其添加到初始化列表中:

          ConfigDialog::ConfigDialog(kimai::Config& config, QWidget *parent)
              : config_ (config)
          {        
              // Do something with config_ - get/set values, etc.
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-09-24
            • 2017-04-03
            • 1970-01-01
            • 2015-05-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多