C ++: возвращение объекта и назначение его функции - PullRequest
0 голосов
/ 20 мая 2018

Я новичок в C ++ и хотел бы сделать что-то вроде этого:

myObj f(){
    // do stuff 
    // return instance of myObj
}

int main(){
    // do stuff
    myObj mO = f(); 
}

Что мне нужно сделать, чтобы эта работа работала в C ++?

Я думал, что мне придется реализовать оператор присваивания для класса / класса myObj или написать другой конструктор, похожий на этот myObj::myObj(myObj mO){...}, который я использую вот так myObj = myObj(f());.

Это правильно?

Должен ли я сделать больше, чтобы эта работа?

Не могли бы вы привести рабочий пример?

Спасибо!

Ответы [ 2 ]

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

C ++ определяет для вас конструктор копирования, оператор присваивания и конструктор перемещения, если это можно сделать тривиально;в этих случаях вам ничего не нужно делать, просто верните экземпляр объекта, и вызывающая сторона получит его.

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

Существуют и другие ограничения, которые препятствуют автоматическому синтезу конструктора перемещения (чтобы избежать ошибок).

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

Для простого случая, когда все работает из коробки без необходимости что-либо делать, подумайте:

// A bi-dimensional point
struct P2d {
    double x, y;
};

// Computes the middle point given two points
P2d average(P2d a, P2d b) {
    return P2d{(a.x+b.x)/2, (a.y+b.y)/2};
}

Как видите, в классе ничего не нужно для поддержки возврата P2d значений или принятия P2d параметров.

Компилятор в этом случае автоматически завершает код определения до чего-то вроде:

struct P2d {
    double x, y;

    P2d(const P2d& other)
      : x(other.x), y(other.y)
    {
    }

    P2d& operator=(const P2d& other) {
        x = other.x;
        y = other.y;
        return *this;
    }

    ~P2d() {
    }
};
0 голосов
/ 20 мая 2018

Это почти компилируется как есть.

//define a class
class myObj {};

// return an instance of the class
myObj f() {
    return myObj{};
}

// call with the same main as in the question:
int main(){
    // do stuff
    myObj mO = f(); 
}
...