Вызов конструктора после объявления переменной класса - PullRequest
1 голос
/ 11 июля 2019

у меня 2 класса Point и Vector.

Я читаю входные данные из файла, который содержит некоторые точки, и я должен построить несколько векторов из этих точек.

Например, первые 3 строки моего файла следующие:

0.0 0.0 50.0 // point a
0.0 0.0 0.0 // point b
0.0 1.0 0.0 // point c

Я занимаюсь разбором ввода в другом классе с именем Stages, который в настоящее время выглядит следующим образом:

class Stages{
    int fileLineNumber;
    Point eyePoint,lookPoint,upPoint;
    Vector eye,look,up;

    void parseInput(){
        // parse the 3 points here
    }

    // ....

Теперь я хочу построить векторы как eye = point b - point a и так далее. Я написал соответствующий конструктор внутри класса Vector:

Vector(Point p1,Point p2){
            Point diff = p2 - p1;
            x = diff.x;
            y = diff.y;
            z = diff.z;
        }

У меня вопрос, поскольку я уже объявил 3 вектора внутри класса Stages, как я могу вызвать конструктор Vector после того, как проанализировал точки? Я могу обойти это, написав функцию внутри класса Vector, которая устанавливает координаты вектора, или создав временный объект Vector внутри функции parseInput() и присвоив его соответствующим векторам. Но я заинтересован в использовании конструктора. Можно ли использовать конструктор после того, как переменная уже объявлена?

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Члены создаются, как только объект создан.Таким образом, конструктор Vector уже был вызван для каждого из трех векторов-членов.

Что вы можете сделать, предполагая, что вектор можно назначить, это построить временный вектор и назначить его члену:

eye = {a, b};
0 голосов
/ 11 июля 2019

Вы можете объявить оператор присваивания копии:

Vector& operator=(const Vector&) = default;

Сгенерированный по умолчанию компилятор достаточно. (C ++ 11) До C ++ 11 просто напишите простой оператор присваивания, который копирует каждое поле. Тогда в вашем коде клиента:

void parseInput()
{
    // suppose pa and pb are Pointer objects, v is a member object
    v = Vector(pa, pb);
}

Компилятор оптимизирует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...