Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 764
от 09.06.2007, 08:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 475, Экспертов: 59
В номере:Вопросов: 1, Ответов: 4


Вопрос № 89859: Все вопросы касаются ООП: 1. Как можно организовать непосредственный доступ к закрытым данным класса? 2. Когда необходимо включать в класс конструктор по умолчанию с пустой реализацией? 3. В каких случаюях имеет сымсл объявлять конструкто...

Вопрос № 89.859
Все вопросы касаются ООП:
1. Как можно организовать непосредственный доступ к закрытым данным класса?
2. Когда необходимо включать в класс конструктор по умолчанию с пустой реализацией?
3. В каких случаюях имеет сымсл объявлять конструктор закрытым?
4. Как добиться того, что бы последовательные 2 символа ** воспринимались как возведение в степень?
5. Может ли быть класс абстрактным, если в нем явно не объявлена ни одна виртуальная функция?
6. Возможно ли использование число виртуальных функций?
7. Что это: int(*t(int))(int*) ??

Всем заранее спасибо, кто дал ответы:)
Отправлен: 03.06.2007, 20:57
Вопрос задал: Pesick (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Mitya86
Здравствуйте, Pesick!

1. Через соответствующие методы. Например в классе есть закрытый член int SomeField. Тогда имеет смысл объявить открытые методы void SetSomeField(int ValueForSomeField) и int GetSomeField()
2. Никогда не слышал о такой необходимости
3. В тех случаях, когда нужно запретить создание объектов данного класса. (Например при реализации паттерна Одиночка)
4. Последние знаки где? В строке?
5. В С++ класс считается абстрактным, только если в нем есть хотя бы одна чисто виртуальная функция
6. Что значит использование чисто виртуальных функций?
7. Не знаю
Ответ отправил: Mitya86 (статус: 3-ий класс)
Ответ отправлен: 03.06.2007, 22:35
Оценка за ответ: 4

Отвечает: Mystic
Здравствуйте, Pesick!
1. Во-первых, согласно основным принципам ООП доступ к закрытым членам предоставлять нежелательно (только в крайнем случае). Но управлять закрытыми членами можно через функции интерфейса (открытые функции), как сделано у другого эксперта.
2. Такая реализация необходима для определения того, что передавать в конструкторы членов класса и базового класса и для перехвата исключений, сгенерированных в этих конструкторах. Кроме того можно просто установить доступ к конструктору по умолчанию как private (например, для паттерна Одиночка).
3. Если вы не хотите разрешить создание объекта извне. Но для этого придется также объявить оператор operator= и копирующий конструктор закрытыми.
4. Такая возможность была специально убрана из С++ из-за синтаксических трудностей. Поэтому этого сделать невозможно (такого оператора нету и его нельзя создать). Для возведения в степень рекомендуется вызывать функции, а не перегружать операторы.
5. К ответу предыдущего эксперта добавлю: Если класс порожден от базового абстрактного класса и не перегрузил его чисто виртуальные функции (кроме деструктора, поскольку в случае необходимости компилятор его создает сам), то и он является абстрактным классом.
6. Можно задать к чисто виртуальной функции реализацию и вызывать ее из классов-потомков. Пример:
class A{
pubilc:
virtual int f() = 0 { return 5; }
};
class B: public A{
public:
virtual int f() { return A::f(); }
};
В этом смысле использование виртуальных функций возможно. Но нельзя создать объект абстрактного класса (кроме указателей и ссылок), поэтому извне эти функции нельзя использовать.
7. Начинаем с середины (с имени переменной t) и идем направо:
середина: t - это..., направо: ...функция с аргументом int..., налево: ...возвращающая указатель на..., направо: ...функцию с агрументом int*..., налево: ...возвращающую int.
Так читаются любые такие конструкции.
Посоветую книгу Философия С++, там разобраны все эти вопросы и еще много других.
Ответ отправил: Mystic (статус: 6-ой класс)
Ответ отправлен: 03.06.2007, 23:20
Оценка за ответ: 5

Отвечает: _Solo_
Здравствуйте, Pesick!
Попробую ответить на некоторые Ваши вопросы.

1. Закрытые (private) члены класса на то и сделаны таковыми, чтобы доступ к ним был возможен только из функций данного класса и дружественных функций и классов. Для организации доступа к ним из любых других функций или классов необходимо предусмотреть в Вашем классе функции для получения и установки значений закрытых переменных.

2. Конструктор по умолчанию необходимо включать в класс в том случае, если Ваш класс содержит другие конструкторы. В этом случае компилятор не будет автоматически создавать пустой конструктор по умолчанию для Вашего класса.

3. Можно предположить следующую ситуацию: Ваш класс должен использоваться только ограниченным набором Ваших же классов. В этом случае все эти классы объявляются дружественными классу с закрытым конструктором...

5. Может. Если он наследует от абстрактного класса и не перегружает определённые там абстрактные функции.

6. Вы не можете создать реализацию абстрактных классов. Поэтому не можете вызвать и чисто виртуальную функцию. Основное использование чисто виртуальных функций- обеспечение завершенности механизма наследования (как правило, корни дерева иерархии классов- абстрактные классы).
Ответ отправил: _Solo_ (статус: 1-ый класс)
Ответ отправлен: 04.06.2007, 00:26
Оценка за ответ: 4

Отвечает: Ross
Здравствуйте, Pesick!

1. Для этого существуют дружественные функции. Если функция void func(void) должна иметь доступ к закрытым элементам вашего класса, то в его объявлении должна быть такая строка:
public:
friend void func(void);
Если нужно обеспечить доступ к вашему классу из другого, то:
public:
friend ИмяКласса;
Тогда ВСЕ функции этого класса станут дружественными по отношению к вашему классу.
2. Дефолтный конструктор должен быть в классе, если вы собираетесь использовать при хранении его объектов std::vector, т.к. он использует этот конструктор для создания объектов внутри контейнера. Тело функции-конструктора может не содержать ничего или производить инициализацию переменных класса (по вашему усмотрению)
---------
Доступно только то, что видимо (c) Б. Керниган
Ответ отправил: Ross (статус: 9-ый класс)
Ответ отправлен: 05.06.2007, 12:02


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.52 от 02.05.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное