Страшный зверь сиплюсплюс
Модератор: Jolly Roger
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Xecutor:
наследование public - это то, почему оно может заработать или то, почему оно не работает? Если первое, то вряд ли - это я уже усвоить успела.
наследование public - это то, почему оно может заработать или то, почему оно не работает? Если первое, то вряд ли - это я уже усвоить успела.
Re: Страшный зверь сиплюсплюс
По идее то, почему не работаетХарука-тян писал(а):Xecutor:
наследование public - это то, почему оно может заработать или то, почему оно не работает? Если первое, то вряд ли - это я уже усвоить успела.
Доступ к protected секции класса родителя при публичном наследовании у класса потомка есть.
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: Страшный зверь сиплюсплюс
иллюстрирую граблю:
заявляет, что для method1, field1 является protected.
Код: Выделить всё
class Parent
{
protected
int field1;
};
class Child: public Parent
{
public:
int method1()
{
return field2->field1;
};
protected:
Parent* field2;
};
Re: Страшный зверь сиплюсплюс
А. Таким образом - да нельзя.
В паскале, насколько я помню, вообще в пределах
юнита полный доступ к protected у всех классов между собой.
Если ну очень хочется опосредованно копаться в protected полях родителя,
можно сделать так:
В паскале, насколько я помню, вообще в пределах
юнита полный доступ к protected у всех классов между собой.
Если ну очень хочется опосредованно копаться в protected полях родителя,
можно сделать так:
Код: Выделить всё
class Child;
class Parent
{
protected:
friend class Child;
int field1;
};
class Child: public Parent
{
public:
int method1()
{
return field2->field1;
};
private:
Parent* field2;
};
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: Страшный зверь сиплюсплюс
При попытке зафрендить класс-предок получаю over 9000 ошибок.
Re: Страшный зверь сиплюсплюс
Я таки скачал svn клиент. Ткни пальцем в каком файле проблема плиз.Харука-тян писал(а):При попытке зафрендить класс-предок получаю over 9000 ошибок.
Там что-то много чего не компиляется.
На всякий случай:
#include <string>
включает класс std::basic_string<T> и typedef для std::string
А вот
#include <string.h>
содержит всякие strcmp и т.д.
Хотя ИМХО с std::string удобнее. Но самую малость медленнее.
Но при чтении конфига это пофик
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: Страшный зверь сиплюсплюс
файл ini.h, процедура TINI::QueryString()
Расскажи, где у тебя ошибки вылазят. У меня просто компиляция происходит нормально, но я же делаю открытый исходный код^^
Расскажи, где у тебя ошибки вылазят. У меня просто компиляция происходит нормально, но я же делаю открытый исходный код^^
- Aerton
- Сообщения: 503
- Зарегистрирован: 11 авг 2007, 02:58
- Откуда: Новосибирск
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Тоже кучи ошибок (в основном, из-за string.h), - у тебя версия gcc случайно не 3.x.x ? Если не пытатся компилировать только ini.cpp то найти нужную ошибку среди прочих действительно нереально.
Наследование даёт доступ только прямым потомкам. А тут получается два разных класса,
и из TINI делается обращение внутрь TEntryAssocArray.
Чтобы лазить друг другу в потроха, надо явно прописать класс, как friend, немного изменив объявление: Ещё момент - конструктор базового класса указывать в наследуемом не нужно - он всё рано неминуемо будет вызван, причём обязательно в первую очередь.
Наследование даёт доступ только прямым потомкам. А тут получается два разных класса,
Код: Выделить всё
typedef TAssocArray<TINIEntry*> TEntryAssocArray;
Код: Выделить всё
typedef TAssocArray<TEntryAssocArray*> TINIArray;
class TINI: public TINIArray;
Чтобы лазить друг другу в потроха, надо явно прописать класс, как friend, немного изменив объявление:
Код: Выделить всё
class TEntryAssocArray: public TAssocArray<TINIEntry*> {
friend class TINI;
};
class TINI: public TAssocArray<TEntryAssocArray*>
Re: Страшный зверь сиплюсплюс
Еще маленькое замечание. Мой гцц варнинг выдаёт на этом:
typedef тут вообще не нужен, и ничего не делает.
По большому счёту typedef на структуры нужен только в чистом С.
Ибо там структуры при использовании надо объявлять struct StructName varName;
В С++ этого нет, поэтому и typedef по сути лишний, даже если новый типа написать
Код: Выделить всё
typedef struct TINIEntry
{
char* a;
enum {typeNum, typeStr, typeBool, typeFlags} EType;
union
{
sint32 n;
bool b;
TFlags f;
};
};
По большому счёту typedef на структуры нужен только в чистом С.
Ибо там структуры при использовании надо объявлять struct StructName varName;
В С++ этого нет, поэтому и typedef по сути лишний, даже если новый типа написать
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Код: Выделить всё
class Parent
{
Parent* Field1;
};
class Child:public Parent
{
void Method1()
{
Parent* Var1 = Field1;
Var1->Method1();
};
};
А как тогда отличать inherited от override?Aerton писал(а):Ещё момент - конструктор базового класса указывать в наследуемом не нужно - он всё рано неминуемо будет вызван, причём обязательно в первую очередь
- Aerton
- Сообщения: 503
- Зарегистрирован: 11 авг 2007, 02:58
- Откуда: Новосибирск
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Конечно, в Parent же нет метода Method1. Если точно известно, что в Field1 объект именно Child, а не Parent или какой-нибудь другой его потомок, то можно сделать явное приведение типаХарука-тян писал(а):Такая конструкция заявляет, что "Method1 не принадлежит к Field1". Как обмануть компилятор, чтобы он не возмущался на эту строчку? Переносить Method1 в Parent - не выход.
Код: Выделить всё
Child *Var1 = (Child*)Field1;
Не уверен, что правильно понимаю значение этих терминов (книжка по Modula-2 давно ушла на растопку за ненадобностьюХарука-тян писал(а):А как тогда отличать inherited от override?
В С++ если метод добавлен в потомок, он всегда перекрывает метод предка. Если про него ничего не указано, то будет использован метод предка. Если метод предка перекрыт, но его надо вызвать, то в имени надо указать класс, к которому он принадлежит.
Код: Выделить всё
Method2(); // метод потомка
Parent::Method2(); // метод предка
GrandParent::Method2(); // метод ещё более далёкого предка
Поэтому, к моменту вызова конструктора потомка, предок уже создан, и значит, его конструктор уже был вызван.
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Пыталась убрать. Отказывается компилироваться, если список передаваемых в конструктор параметров отличен от void.Aerton писал(а):Ещё момент - конструктор базового класса указывать в наследуемом не нужно - он всё рано неминуемо будет вызван
Сделала бегающую собачку на фоне карты. Надеюсь, дальше дело пойдёт без граблей. Спасибо за поддержку и с праздником Вас, ребята!
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Боюсь тебя разачаровывать, но там еще столько граблей тебя ждет...Харука-тян писал(а): Сделала бегающую собачку на фоне карты. Надеюсь, дальше дело пойдёт без граблей. Спасибо за поддержку и с праздником Вас, ребята!
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Я имела ввиду грабли, связанные с языком
Re: Страшный зверь сиплюсплюс
В С++ если у класса есть конструктор с параметрами, не считая конструктора копирования,Харука-тян писал(а):Пыталась убрать. Отказывается компилироваться, если список передаваемых в конструктор параметров отличен от void.Aerton писал(а):Ещё момент - конструктор базового класса указывать в наследуемом не нужно - он всё рано неминуемо будет вызван
то конструктор по умолчанию не генерируется.
И тогда естественно нужно вызывать конструктор базового класса явно.
Или таки написать свой конструктор по умолчанию.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 43 гостя