2010-09-18 3 views
1

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

Пример:

//------------------------------------------- 
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 

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

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

ответ

4

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

2

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

EDIT 2:

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

1

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

Другу классов и функций Friend

+0

Я использую чистые виртуальные базовые классы, поэтому не знаю, кто такие друзья. – slashmais

+0

Если вы используете чистые виртуальные функции, виртуальные базовые классы и множественное наследование, то вы можете пойти на деликатес класса сестры. Подробнее на http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.10 Но, во-первых, я бы рекомендовал не менять частный контент в другом классе. Вы можете обрабатывать строку в классе Others и возвращать модифицированную строку Owner, чтобы она была назначена самому владельцу. – bjskishore123

+0

В этом примере местные жители просто используют другие, чтобы выполнить работу. Что не так с этим?Класс должен иметь возможность манипулировать своими частными членами любым способом, которым он нравится? - По той же логике вы не сможете ничего сделать с частным членом строки. Если вы хотите вызвать на нем строковый метод, вы передадите ссылку на частный член как аргумент '* this' для строкового метода! – UncleBens

1

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

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

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

+0

@Hapio: создав метод const, класс Others не может изменить объект. Но slashmais хочет изменить частную часть объекта в другом классе. Он упомянул: «Мне нужно сделать что-то подобное, используя другие/разные объекты, которые принадлежат классу владельца, но при необходимости меняются другими». – bjskishore123

+0

Да, я просто сказал, что компилятор выдаст ошибки, если он пометит метод как const. Если это не const, нет гарантии, что состояние объекта не изменится. – Haplo

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