Вернуть только для чтения двойной указатель - PullRequest
5 голосов
/ 08 июня 2011

Я хочу переменную-член, которая является двойным указателем. Объект, на который указывает двойной указатель, не должен изменяться извне класса.

Моя следующая попытка дает "недопустимое преобразование из ‘std :: string **’ в ‘const std :: string **’ »

class C{

public:
    const std::string **getPrivate(){
        return myPrivate;
    }

private:
    std::string **myPrivate;
};
  • Почему такая же конструкция действительна, если я использую простой указатель std::string *myPrivate
  • Что я могу сделать, чтобы вернуть двойной указатель только для чтения?

    Это хороший стиль для явного приведения return (const std::string**) myPrivate?

Ответы [ 3 ]

3 голосов
/ 08 июня 2011

Попробуйте это:

const std::string * const *getPrivate(){
    return myPrivate;
}

Проблема с const std :: string ** заключается в том, что он позволяет вызывающей стороне изменять один из указателей, который не объявлен как const.Это делает как указатель, так и сам класс строки константой.

2 голосов
/ 08 июня 2011

В c ++ есть очень редкие случаи, когда необработанный указатель (даже меньше для двойного указателя) действительно необходим, и ваш случай не кажется одним из них.Правильным способом было бы вернуть значение или ссылку, например:

class C{

public:
    const std::string& getPrivate() const
    {
        return myPrivate;
    }

private:
    std::string myPrivate;
};
2 голосов
/ 08 июня 2011

Если вы хотите быть действительно придирчивым:

class C {

public:
    std::string const* const* const getPrivate(){
        return myPrivate;
    }

private:
    std::string **myPrivate;
};
...