Вопрос № 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