2012-05-15 3 views
2

Я член класса определяется как:Как вернуть значение, указанное указателем?

someType* X; 

и я получаю это нравится:

someType* getX() {return x;} 

Я хотел бы получить значение, а не указатель, а именно:

someType getX() {return x;} //this is wrong 

для чего это правильный синтаксис? Как получить значение, а не указатель?

+10

Вам нужно получить хорошую книгу на C++ и ** прекратить использование указателей ** до тех пор (и, вероятно, в течение некоторого времени после этого). Сначала изучите основы C++, указатели позже (нет, это * не * основы!). –

ответ

11
someType getX() {return *x;} 

Примечание, однако, что это возвращает xпо значению, то есть он создает копию x при каждом возврате *. Так (в зависимости от того, что someType на самом деле) вы можете предпочесть возвращать ссылку вместо:

someType& getX() {return *x;} 

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

* В некоторых случаях это может быть оптимизировано Оптимизация возвращаемого значения, так как @ paul23 справедливо указывает ниже. Однако безопасное поведение не должно рассчитывать на это в целом. Если вы не хотите создавать дополнительную копию, проясните ее в коде как для компилятора, так и для читателей людей, вернув ссылку (или указатель).

+1

+1 для возврата ссылки лучше. – Jagannath

+2

-Общая заметка об оптимизации возвращаемых значений. http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.9 – paul23

+0

Возвращаясь к изменяемой ссылке, имеет другую семантику. –

1
SomeType getX() 
{ 
    // SomeType x = *x; // provided there is a copy-constructor if  
    // user-defined type. 
    // The above code had the typo. Meant to be. 
    SomeType y = *x; 
    return y; 
} 
+0

Что в этом плохого? Здесь проблема производительности, но она служит цели вопроса. – Jagannath

+0

Извините, опечатайте там. Представляется SomeType y = * x; return y; – Jagannath

2
someType getX() const { return *x; } 

или в качестве альтернативы, если someType дорого копировать, вернуть его const ссылкой:

someType const &getX() const { return *x; } 

Обратите внимание, что const классификатор по методу.

Смежные вопросы