2009-11-26 3 views
0

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

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

+0

Как насчет кода? Трудно помочь только смутным вопросом. – rlbond

+0

Сцепление натуральное ... Просто друзья ... мальчик, это какой-то * непристойный * код! –

ответ

0

Это звучит так, как будто друзья классов побеждают цель разделения одного класса, который «слишком велик». Если вы это сделаете, вы разделите класс на два, но они все равно будут тесно связаны и так же неотделимы, как и раньше.

Один из подходов - написать публичные методы, которые описывают, что вы хотите сделать в ответ на ввод. Например, если ваш класс представляет курсор, который может перемещаться в четырех направлениях на основе ввода клавиши со стрелкой, вы должны писать такие методы, как «MoveUp» и «MoveLeft», а затем вызывать эти методы вне класса в ответ на входные события. В этом случае нет необходимости обращаться к данным частного курсора класса.

2

На ваш вопрос нет окончательного ответа; Честно говоря, это действительно вопрос вкуса. Похоже, что использование ключевого слова friend здесь прекрасное, если эти два класса логически связаны, особенно если никому другому классу не понадобится доступ к переменным частного члена, на которые вы ссылаетесь. Другим вариантом было бы сделать класс обработки ввода вложенным классом внутри основного класса. Затем он автоматически получит доступ к частным переменным-членам и более решительно подчеркнет логическую связь двух классов.

Но это субъективный суждение; любой подход, который, по вашему мнению, делает ваш код более читаемым, доступным и более простым в обслуживании, является правильным ответом.

+0

В C++ вложенные классы не имеют доступа к закрытым членам класса вложенности. Он должен быть другом и иметь родительский указатель. В Java это автоматическое. – stefaanv

+0

Стандарт C++ 03 автоматически не предоставляет доступ вложенным классам к закрытым членам охватывающего класса, но это считается дефектом. См. Http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#45. Большинство основных компиляторов позволяют это, и это будет разрешено в стандарте C++ 0x. Таким образом, для всех целей и целей ключевое слово friend не обязательно –

+0

Хорошо, я попробовал его в gcc, и он работает. Я стою исправлено. Он сохраняет декларацию «друг», которая мне в порядке. Спасибо, что поделились этим. – stefaanv

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