C ++ передает ссылку на частную переменную класса - проблема компилятора? - PullRequest
1 голос
/ 18 сентября 2010

Является ли передача по ссылке закрытой переменной в классе напрямую изменяемой за пределами этого класса приемлемой практикой?Или это то, что компилятор «должен» подобрать и предотвратить?

Пример:

//-------------------------------------------
class Others
{
public:
 Others() {};
 void ChangeIt(string &str) { str = "Changed by Others"; }
};

//-------------------------------------------
class Locals
{
private:
 string PrivateString;
public:
 Locals() { PrivateString = "Set by Locals"; };
 void VisitOthers() { Others o; o.ChangeIt(PrivateString); }
 const string GetString() { return PrivateString; }
};

//-------------------------------------------
int main(void)
{
 Locals lo;
 cout << lo.GetString() << "\n";
 lo.VisitOthers();
 cout << lo.GetString() << "\n";
 return 0;
}

Вывод:

Set by Locals
Changed by Others

Мне нужно сделать что-то вроде этогоиспользование других / других объектов, приватных для класса владельца, но изменяемых другими при необходимости.Последнее, что я хочу, - это чтобы такая практика возвращалась и меня побеспокоила в будущем.

Что меня по-настоящему беспокоит, так это то, что я хотел бы рассматривать класс / структуру в основном как указатель на буфери адрес члена как смещения в этом буфере, так что даже если вы передадите значение-указатель члена, он будет бесполезен без базового указателя класса / структуры, к которой он принадлежит.Это то, что я инстинктивно чувствую, так и должно быть, так что приведенный выше пример даже не будет возможен.

Ответы [ 4 ]

4 голосов
/ 18 сентября 2010

Ничто не мешает, вы передаете своего частного участника по ссылке. Функция, которую вы вызываете, не обращается к вашему приватному члену, она меняет свой собственный аргумент (который является членом какого-то класса). Код в порядке, но важно то, что вызванная вами функция не хранит ссылку на ваш приватный член.

2 голосов
/ 18 сентября 2010

Как разработчик класса, C ++ не помешает вам раздавать ссылки на закрытые члены класса кому-либо. Однако может быть целесообразно ограничить такой доступ только авторизованным субъектам, например, друзья, и в этом случае доступ к таким частным пользователям на самом деле не так важен, как «по замыслу».

РЕДАКТИРОВАТЬ 2:

Мутантная версия operator[] для класса также обычно предоставляет интерфейс для внешних объектов для изменения закрытых членов.

1 голос
/ 18 сентября 2010

Проходить приватные участники совершенно нормально.Вы могли бы указать, что VisitOthers () не изменяет ваш объект, делая его методом const.Если бы метод был:

void VisitOthers() const {Other o; o.visit(PrivateString);}

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

1 голос
/ 18 сентября 2010

Это не очень хорошая практика. Если вы хотите, чтобы другие объекты изменили ваш объект, тогда выберите

Классы друзей и функции друзей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...