【问题标题】:C++: Unable to reassign class, online the default constructor is usedC++:无法重新分配类,在线使用默认构造函数
【发布时间】:2018-05-30 13:29:38
【问题描述】:

我正在尝试使用我在另一个课程中编写的课程。问题是我很难使用原始类中的默认参数/构造函数以外的任何东西。

我已经简化了下面的类以显示我想要实现的目标(我已经尝试了所有我能想到的变体,但我认为基本上我不明白发生了什么)。

当我通过 class_one 调用 class_two 时,我想使用自己的值进行计算。但是,当我尝试这样做时,我只会得到用 class_two 编写的默认参数。

class class_one {

private:
    double a;
    class_two class2;

public:

    class_one(double A = 0.5, double B = 0.2) {
        a = A;
        class2 = class_two(b);
    }

    double calculation(){
        return A*class2.get_b();
    }
}

class_two 会在哪里,

class class_two {

private:
    double b;

public:
    class_two(double B = 0.5){
        b = B;
    }

    double get_b(){
         return b;
    }

}

我正在尝试运行的示例,

class_one().calculation();

actual output: A*B = 0.5 * 0.5 (Where the B values comes from class_two)

desired output: A*B = 0.5 * 0.2 (Where the B values comes from class_one)

抱歉,这似乎是一个超级简单的问题,但我无法让它发挥作用!

【问题讨论】:

  • 一个类的数据成员在构造函数体开始之前被完全初始化。如果要指定默认构造函数以外的初始化,则需要使用member initializer list
  • 构造函数中有Bbcosmology 是什么?
  • 好的,谢谢,当我试图在这里找到解决方案时,我一直遇到这个问题。问题是我不明白成员初始化列表是什么,我希望有一个更简单的解决方案。我现在会尝试理解这一点。你认为我应该删除我的问题吗?
  • "更简单的解决方案" - 没有什么比成员初始化列表更简单的了,它基本上是 class_one(double A = 0.5, double B = 0.2) : a(A), class2(B) { } 而不是你当前的构造函数。
  • 但是你的问题不在这里......一旦错别字被修复,你的代码工作正常(wandbox.org/permlink/819PMdAORhuO08xO)......你需要提供一个重现问题的例子(并且你测试过,即在发布之前编译并运行)。

标签: c++ class oop variable-assignment


【解决方案1】:

当一个类的构造函数被调用时——在它的主体开始执行之前——它的所有数据成员都被初始化了。这意味着对于 `class_two,默认构造函数被调用来创建它,因为你没有说任何不同的东西。

为了实现您的目标,请使用初始化列表,如下所示:

class_one(double A = 0.5, double B = 0.2) : a(A), class_two(B) {
    // leave it empty in this case
}

PS:我也通过初始化列表初始化了a,这与您的问题无关,但这是一个好习惯,因为数据成员的初始化通常是通过初始化列表完成的,而不是在构造函数本身。

【讨论】:

    【解决方案2】:

    我的错误很愚蠢,也不是很有趣。

    基本上,我使用 class2 来分配变量,但我只是在完成此操作后才重新分配 class2。我没有意识到这一点。

    感谢 Holt 向我展示了我的问题不是我认为的问题,以及 gsamarasFrançois Andrieux 解释说最好在这种情况下使用初始化列表!

    class class_one {
    
    private:
        double a;
        class_two class2;
    
    public:
    
        class_one(double A = 0.5, double B = 0.2) {
            a = A*set_a();
            class2 = class_two(b);
        }
    
        double set_a(){
            return class2.some_function();
        }
    
        double calculation(){
            return A*class2.get_b();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多