C ++ частный указатель "утечка"? - PullRequest
2 голосов
/ 13 апреля 2010

Я собираюсь создать класс для длинного списка параметров, которые будут переданы функции. Давайте использовать этот более короткий пример:

class ParamList{

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

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

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

Спасибо, JBU

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

Ответы [ 2 ]

3 голосов
/ 13 апреля 2010

Получение приватной ссылки совершенно нормально, если:

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

Хотя есть полезные случаи для возврата неконстантной ссылки, обычно ее следует избегать. Это описано в Эффективном Скотте Мейерсе C ++ (3-е издание, пункт 28): избегайте возврата «ручек» внутренним объектам, если вы хотите взглянуть.

2 голосов
/ 13 апреля 2010

Прежде всего, вам нужно решить, будет ли 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;
}

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

...