Я перехожу от Java к С++ и немного запутался в языковой гибкости. Один момент состоит в том, что есть три способа хранения объектов: указатель, ссылка и скаляр (сохраняя сам объект, если я его правильно понимаю).
Я стараюсь использовать ссылки там, где это возможно, потому что это как можно ближе к Java. В некоторых случаях, например, getters для производных атрибутов, это невозможно:
MyType &MyClass::getSomeAttribute() {
MyType t;
return t;
}
Это не компилируется, потому что t
существует только в пределах области getSomeAttribute()
, и если я верну ссылку на него, это будет указывать на то, что клиент не сможет его использовать.
Поэтому у меня осталось два варианта:
- Возвращает указатель
- Возвращает скаляр
Возврат указателя будет выглядеть так:
MyType *MyClass::getSomeAttribute() {
MyType *t = new MyType;
return t;
}
Это работает, но клиенту нужно будет проверить этот указатель на NULL
, чтобы быть действительно уверенным, что не нужно со ссылками. Другая проблема заключается в том, что вызывающий пользователь должен убедиться, что t
освобожден, я бы предпочел не заниматься этим, если я могу его избежать.
Альтернативой было бы вернуть сам объект (скаляр):
MyType MyClass::getSomeAttribute() {
MyType t;
return t;
}
Это довольно просто и просто то, что я хочу в этом случае: оно похоже на ссылку, и оно не может быть нулевым. Если объект находится вне области действия в клиентском коде, он удаляется. Довольно удобно. Однако я редко вижу, что кто-то это делает, есть ли причина для этого? Есть ли какая-то проблема с производительностью, если я возвращаю скаляр вместо указателя или ссылки?
Каков наиболее распространенный/элегантный подход для решения этой проблемы?