2010-04-12 5 views
2

Я собираюсь создать класс для хранения длинного списка параметров, которые будут переданы функции. Давайте использовать этот сокращенный пример:C++ частный указатель «утечка»?

class ParamList{ 

public: 
    ParamList(string& a_string); 
    string& getString(); //returns my_string 
private: 
    string& my_string; 
} 

Мой вопрос заключается в следующем: my_string является частным, но я возвращает ссылку на него. Разве это не называется чем-то вроде личного указателя, протекающего в C++? Разве это не хорошая практика программирования? Я хочу, чтобы получатели getString могли получить ссылку, а также изменить ее.

Пожалуйста, дайте мне знать.

Спасибо, JBU

edit1: звонящие будут использовать GetString() и изменить строку, которая была возвращена.

+3

Имея ссылки в качестве членов, это сомнительная практика, если вы точно не знаете, что делаете. Но я не вижу указателей в этом коде. – 2010-04-12 21:55:56

+0

ОК. Я не знаю, что я делаю. Что, если my_string был указателем, а getString возвратил указатель на строку? – jbu

+0

Он все равно должен возвращать 'const string *' – David

ответ

2

Прежде всего, вам нужно решить, будет ли ParamList владеть строкой или просто «знать об этом». То, как вы его написали, с string& my_string, означает, что у него просто ручка на чужой строке. В этом случае для некоторых из них не проблема (большая часть), чтобы изменить строку, поскольку ParamList не владеет ею в первую очередь!

Если вы хотите ParamList иметь полный мастер-копию параметров (зависит от задачи, которую вы пытаетесь решить), сделать что-то вроде этого:

class ParamList{ 

public: 
    ParamList(const string& a_string); // do a strcpy in here. 

    const string& getString(); //returns my_string 
    void setString(const string& new_string); //do a strcpy here too. 
private: 
    string my_string; 
} 

Обратите внимание, что, вероятно, лучше использовать множество и получить функции в любом случае, а не возвращать неконстантную ссылку, так что ParamList может немного контролировать контроль своих членов.

+4

«Сделай строгий» ??? – 2010-04-12 22:15:24

+0

@Neil: сокращенное обозначение "копия из одной строки в другую". – David

+3

Название функции в стандартной библиотеке - возможность путаницы: высокая. – 2010-04-12 22:44:25

3

Returing личной ссылки совершенно нормален, пока:

А. Это является const ссылкой, и вы зафиксировали, когда эта ссылка может быть признана недействительной или
B. Этой ссылка предназначена быть изменено (т.е. std::vector<T>::operator[])

Хотя есть полезные случаи для возврата неконстантной ссылки, вы обычно должны избегать ее. Это описано в Scott Meyers' Effective C++ (3-е издание, статья 28). Избегайте возврата «ручек» к внутренним объектам, если вы хотите взглянуть.

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