Страшный зверь сиплюсплюс

Закрытые или заброшенные проекты, не состоявшие в Клубе, но имевшие ветку на форуме.

Модератор: Jolly Roger

Есть ли смысл в переходе на С++?

Нет, переписывай заново на fpc
7
25%
Да, причем пиши под *никсы
9
32%
Нет, переходи на VBS
0
Голосов нет
А почему не Ява?
12
43%
 
Всего голосов: 28

Аватара пользователя
Харука-тян
Мастер
Сообщения: 544
Зарегистрирован: 29 ноя 2006, 00:23
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Харука-тян » 18 фев 2010, 16:40

Xecutor:
наследование public - это то, почему оно может заработать или то, почему оно не работает? Если первое, то вряд ли - это я уже усвоить успела.
"Женщина верит, что дважды два будет пять, если хорошенько поплакать и устроить скандал" (© Дж. Элиот).
ИзображениеИзображение

Аватара пользователя
Xecutor
Мастер
Сообщения: 758
Зарегистрирован: 25 мар 2008, 08:32

Re: Страшный зверь сиплюсплюс

Сообщение Xecutor » 18 фев 2010, 16:44

Харука-тян писал(а):Xecutor:
наследование public - это то, почему оно может заработать или то, почему оно не работает? Если первое, то вряд ли - это я уже усвоить успела.
По идее то, почему не работает :)
Доступ к protected секции класса родителя при публичном наследовании у класса потомка есть.

Аватара пользователя
Харука-тян
Мастер
Сообщения: 544
Зарегистрирован: 29 ноя 2006, 00:23
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Харука-тян » 18 фев 2010, 16:49

иллюстрирую граблю:

Код: Выделить всё

class Parent
{
protected
  int field1;
};

class Child: public Parent
{
public:  
  int method1()
  {
    return field2->field1;
  };
protected:
  Parent* field2;
};
заявляет, что для method1, field1 является protected.
"Женщина верит, что дважды два будет пять, если хорошенько поплакать и устроить скандал" (© Дж. Элиот).
ИзображениеИзображение

Аватара пользователя
Xecutor
Мастер
Сообщения: 758
Зарегистрирован: 25 мар 2008, 08:32

Re: Страшный зверь сиплюсплюс

Сообщение Xecutor » 18 фев 2010, 16:54

А. Таким образом - да нельзя.
В паскале, насколько я помню, вообще в пределах
юнита полный доступ к 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: Страшный зверь сиплюсплюс

Сообщение Харука-тян » 18 фев 2010, 17:10

При попытке зафрендить класс-предок получаю over 9000 ошибок.
"Женщина верит, что дважды два будет пять, если хорошенько поплакать и устроить скандал" (© Дж. Элиот).
ИзображениеИзображение

Аватара пользователя
Xecutor
Мастер
Сообщения: 758
Зарегистрирован: 25 мар 2008, 08:32

Re: Страшный зверь сиплюсплюс

Сообщение Xecutor » 18 фев 2010, 17:22

Харука-тян писал(а):При попытке зафрендить класс-предок получаю over 9000 ошибок.
Я таки скачал svn клиент. Ткни пальцем в каком файле проблема плиз.
Там что-то много чего не компиляется.

На всякий случай:
#include <string>
включает класс std::basic_string<T> и typedef для std::string
А вот
#include <string.h>
содержит всякие strcmp и т.д.
Хотя ИМХО с std::string удобнее. Но самую малость медленнее.
Но при чтении конфига это пофик :)

Аватара пользователя
Харука-тян
Мастер
Сообщения: 544
Зарегистрирован: 29 ноя 2006, 00:23
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Харука-тян » 18 фев 2010, 19:52

файл ini.h, процедура TINI::QueryString()

Расскажи, где у тебя ошибки вылазят. У меня просто компиляция происходит нормально, но я же делаю открытый исходный код^^
"Женщина верит, что дважды два будет пять, если хорошенько поплакать и устроить скандал" (© Дж. Элиот).
ИзображениеИзображение

Аватара пользователя
Aerton
Сообщения: 503
Зарегистрирован: 11 авг 2007, 02:58
Откуда: Новосибирск
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Aerton » 18 фев 2010, 22:56

Тоже кучи ошибок (в основном, из-за string.h), - у тебя версия gcc случайно не 3.x.x ? Если не пытатся компилировать только ini.cpp то найти нужную ошибку среди прочих действительно нереально.

Наследование даёт доступ только прямым потомкам. А тут получается два разных класса,

Код: Выделить всё

typedef TAssocArray<TINIEntry*> TEntryAssocArray;

Код: Выделить всё

typedef TAssocArray<TEntryAssocArray*> TINIArray;
class TINI: public TINIArray;
и из TINI делается обращение внутрь TEntryAssocArray.

Чтобы лазить друг другу в потроха, надо явно прописать класс, как friend, немного изменив объявление:

Код: Выделить всё

class TEntryAssocArray: public TAssocArray<TINIEntry*> {
    friend class TINI;
};

class TINI: public TAssocArray<TEntryAssocArray*>
Ещё момент - конструктор базового класса указывать в наследуемом не нужно - он всё рано неминуемо будет вызван, причём обязательно в первую очередь.

Аватара пользователя
Xecutor
Мастер
Сообщения: 758
Зарегистрирован: 25 мар 2008, 08:32

Re: Страшный зверь сиплюсплюс

Сообщение Xecutor » 19 фев 2010, 05:45

Еще маленькое замечание. Мой гцц варнинг выдаёт на этом:

Код: Выделить всё

typedef struct TINIEntry
				{
					char* a;
					enum {typeNum, typeStr, typeBool, typeFlags} EType;
					union
					{
						sint32	n;
						bool	b;
						TFlags	f;
					};
				};
typedef тут вообще не нужен, и ничего не делает.
По большому счёту typedef на структуры нужен только в чистом С.
Ибо там структуры при использовании надо объявлять struct StructName varName;
В С++ этого нет, поэтому и typedef по сути лишний, даже если новый типа написать :)

Аватара пользователя
Харука-тян
Мастер
Сообщения: 544
Зарегистрирован: 29 ноя 2006, 00:23
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Харука-тян » 21 фев 2010, 12:03

Код: Выделить всё

class Parent
{
  Parent* Field1;
};

class Child:public Parent
{
  void Method1()
  {
    Parent* Var1 = Field1;
    Var1->Method1();
  };
};
Такая конструкция заявляет, что "Method1 не принадлежит к Parent". Как обмануть компилятор, чтобы он не возмущался на эту строчку? Переносить Method1 в Parent - не выход.
Aerton писал(а):Ещё момент - конструктор базового класса указывать в наследуемом не нужно - он всё рано неминуемо будет вызван, причём обязательно в первую очередь
А как тогда отличать inherited от override?
"Женщина верит, что дважды два будет пять, если хорошенько поплакать и устроить скандал" (© Дж. Элиот).
ИзображениеИзображение

Аватара пользователя
Aerton
Сообщения: 503
Зарегистрирован: 11 авг 2007, 02:58
Откуда: Новосибирск
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Aerton » 21 фев 2010, 12:45

Харука-тян писал(а):Такая конструкция заявляет, что "Method1 не принадлежит к Field1". Как обмануть компилятор, чтобы он не возмущался на эту строчку? Переносить Method1 в Parent - не выход.
Конечно, в Parent же нет метода Method1. Если точно известно, что в Field1 объект именно Child, а не Parent или какой-нибудь другой его потомок, то можно сделать явное приведение типа

Код: Выделить всё

Child *Var1 = (Child*)Field1;
Харука-тян писал(а):А как тогда отличать inherited от override?
Не уверен, что правильно понимаю значение этих терминов (книжка по Modula-2 давно ушла на растопку за ненадобностью :-)

В С++ если метод добавлен в потомок, он всегда перекрывает метод предка. Если про него ничего не указано, то будет использован метод предка. Если метод предка перекрыт, но его надо вызвать, то в имени надо указать класс, к которому он принадлежит.

Код: Выделить всё

Method2(); // метод потомка
Parent::Method2(); // метод предка
GrandParent::Method2(); // метод ещё более далёкого предка
Конструкторы же вызываются всегда все, потому что классы потомки являются как бы "добавками" к предкам. Создание объекта происходит так: выделяется память под потомка, включающего предка. Созадётся виртуальная таблица предка. Вызывается конструктор предка. В этот момент потомка ещё вообще не существует и предок ничего о нём не может знать. Только после этого созадётся/обновляется виртуальная таблица потомка и вызывается его конструктор.

Поэтому, к моменту вызова конструктора потомка, предок уже создан, и значит, его конструктор уже был вызван.

Аватара пользователя
Харука-тян
Мастер
Сообщения: 544
Зарегистрирован: 29 ноя 2006, 00:23
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Харука-тян » 23 фев 2010, 08:52

Aerton писал(а):Ещё момент - конструктор базового класса указывать в наследуемом не нужно - он всё рано неминуемо будет вызван
Пыталась убрать. Отказывается компилироваться, если список передаваемых в конструктор параметров отличен от void.

Сделала бегающую собачку на фоне карты. Надеюсь, дальше дело пойдёт без граблей. Спасибо за поддержку и с праздником Вас, ребята!
"Женщина верит, что дважды два будет пять, если хорошенько поплакать и устроить скандал" (© Дж. Элиот).
ИзображениеИзображение

Аватара пользователя
Jesus05
Сообщения: 1840
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Jesus05 » 23 фев 2010, 18:49

Харука-тян писал(а): Сделала бегающую собачку на фоне карты. Надеюсь, дальше дело пойдёт без граблей. Спасибо за поддержку и с праздником Вас, ребята!
Боюсь тебя разачаровывать, но там еще столько граблей тебя ждет...

Аватара пользователя
Харука-тян
Мастер
Сообщения: 544
Зарегистрирован: 29 ноя 2006, 00:23
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Харука-тян » 23 фев 2010, 20:13

Я имела ввиду грабли, связанные с языком
"Женщина верит, что дважды два будет пять, если хорошенько поплакать и устроить скандал" (© Дж. Элиот).
ИзображениеИзображение

Аватара пользователя
Xecutor
Мастер
Сообщения: 758
Зарегистрирован: 25 мар 2008, 08:32

Re: Страшный зверь сиплюсплюс

Сообщение Xecutor » 24 фев 2010, 07:19

Харука-тян писал(а):
Aerton писал(а):Ещё момент - конструктор базового класса указывать в наследуемом не нужно - он всё рано неминуемо будет вызван
Пыталась убрать. Отказывается компилироваться, если список передаваемых в конструктор параметров отличен от void.
В С++ если у класса есть конструктор с параметрами, не считая конструктора копирования,
то конструктор по умолчанию не генерируется.
И тогда естественно нужно вызывать конструктор базового класса явно.
Или таки написать свой конструктор по умолчанию.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 48 гостей