Простой вопрос, возможно, присутствовал здесь в других реинкарнациях, просто не может его найти... (и я знаю, я мог бы попробовать это, но это не оставило бы следов на благо сообщества).
Какова наилучшая практика для метода getter С++, который должен возвращать нетривиальный тип, но член, который относится к типу класса или структуре.
- Возврат по значению, например:
MyType MyClass::getMyType() { return mMyType; }
- Возврат по ссылке const:
const MyType& MyClass::getMyType() { return mMyType; }
- Возврат по адресу:
MyType* MyClass::getMyType() { return &mMyType; }
где
class MyType { /* ... */ };
class MyClass
{
private:
MyType mMyType;
}
Я особо беспокоюсь о следующих применениях этого метода. Не могли бы вы подробно рассказать о том, как это может повлиять на копирование объекта и на опасность оборванных ссылок и диких указателей, если function()
хочет сохранить его для дальнейшего использования.
MyType* savedPointer;
SomeType function(MyType* pointer) { savedPointer = pointer; };
а. действительны для 1. и 2.
{
MyType t = myClass.getMyType();
function(&t);
}
// is savedPointer still valid here?
б. действительны для 1. и 2.
{
const MyType& t = myClass.getMyType();
function(&t);
}
// is savedPointer still valid here?
с. действительны для 1. и 2.
{
MyType& t = myClass.getMyType();
function(&t);
}
// is savedPointer still valid here?
д. действует для 3.
{
MyType* t = myClass.getMyType();
function(t);
}
// is savedPointer still valid here?
где myClass
- объект типа myClass
.