C ++: невозможно переназначить класс, в сети используется конструктор по умолчанию - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь использовать класс, который я написал в другом классе.Проблема в том, что мне трудно использовать что-либо, кроме параметров / конструктора по умолчанию из исходного класса.

Я упростил приведенные ниже занятия, чтобы показать, чего я пытаюсь достичь (я попробовал все варианты этого, о которых я мог подумать, но, по-моему, принципиально не понимаю, что происходит).

Когда я звоню от class_two до class_one , я хочу использовать мои собственные значения для расчета.Однако, когда я пытаюсь это сделать, я просто получаю параметры по умолчанию, записанные в 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)

Извинения, это кажется очень простым вопросом, но я не могу заставить его работать!

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Моя ошибка была очень глупой и не очень интересной.

В основном я использовал class2 для присваивания переменных, но я переназначал class2 только после того, как сделал это.Я не понял этого.

Спасибо Холт за то, что показали мне, что моя проблема была не там, где я думал, и gsamaras и Франсуа Андриё для объяснения, что лучше использовать список инициализации для этого сценария!

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();
    }
}
0 голосов
/ 30 мая 2018

Когда вызывается конструктор класса, то, прежде чем его тело начинает выполняться, все его члены данных инициализируются.Это означает, что для `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 также через список инициализаторов, что не имеет отношения к вашему вопросу, но есть хорошая привычка, поскольку инициализация элементов данных обычно выполняется посредством инициализациисписок, а не в теле самого конструктора.

...