xztau
@xztau
Я

Как вернуть копию объекта?

Есть такой код:
class Object
{
	private: double i,j,k = 0;
};

class ObjectContainer
{
public:
	ObjectContainer(){listOfObject << new Object();/*многораз*/}
private: 
	list<Object> listOfObject;
public: 
	Object getMeAnyObject(int i)
	{
		return listOfObject.at(i);
	}
};

/****************************************************/
int main()
{
	ObjectContainer oc;
	Object o;
	o = oc.getMeAnyObject(1);
}


Я хочу вернуть копию объекта из контейнера, а не ссылку. Верен ли мой код?
  • Вопрос задан
  • 2545 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
По сути своей два вопроса будут...
Object getMeAnyObject(int i)
  {
    return listOfObject.at(i);
  }

Я хочу вернуть копию объекта из контейнера, а не ссылку. Верен ли мой код?

Верен, если вы правильно расставили теги, и это действительно C++. Правда, в этом случае здесь listOfObject << new Object(); написана какая-то ерунда.
Второго вопроса не увидел.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
За тело конструктора в объявлении конструктора надо съездить автору линейкой по пальцам. Или это C#?

int для индексов объектов - лажа, нужно использовать size_t. Учебники, в которых авторы по привычке лепят int куда ни попадя - жарить в духовке до готовности. Температура - 451 по Фаренгейту.

Object getMeAnyObject(int i) - такая же лажа, нужно определить константный и неконстантый операторы индекса [].

В целом, попытка использовать list вместо vector - лажа.

По факту - с чего вы вообще взяли, что тут будет какая-то ссылка? Делая присваивание, вы выполняете копирование.

Ах да, еще одна Лажа Петровна:
Object o;
  o = oc.getMeAnyObject(1);

Это ведь i like to move it move it! (два вызова - конструктор и присваивание) форменное. Как насчет
Object o=oc.getMeAnyObject(9000)? Это ведь даже сподвигнет компилятор на RVO и вообще выкинет одно из копирований.
Ответ написан
Данный код возвращает копию объкта (был не верный ответ ссылку) .

Возвращать копию объекта не самое лучшее решение т.к. вызывающий код должен будет заботиться об его уничтожении. Лучше возвращать ссылку на константный объект если нужно, что бы вызывающий код не мог его менять.

Если желание возвращать копию пересилит то нужно реализовать копирующий конструктор (return new Object(listOfObject.at(i));) или использовать семантику перемещения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы