Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Знает ли статическая функция о типе своего обьекта, ? 
:(
    Опции темы
Logo
Дата 14.3.2012, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 1
Всего: 10



Есть статическая функция, своего рода конструктор, который создает обьект. Она обращается к абстрактному методу обьекта, который определяется в классе наследнике.
Она должна наследоваться, и уметь вызывать этот метод.
Подстажите, как ее нужно реализовать, правильно ли я понимаю, только через шаблон?

Это сообщение отредактировал(а) Logo - 14.3.2012, 16:58
PM MAIL   Вверх
baldina
Дата 14.3.2012, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Logo @  14.3.2012,  16:55 Найти цитируемый пост)
Она обращается к абстрактному методу обьекта

если объект есть, то полиморфизм будет работать.

Добавлено через 53 секунды
Цитата(Logo @  14.3.2012,  16:55 Найти цитируемый пост)
Есть статическая функция, своего рода конструктор, который создает обьект

однако если эта функция сама создает объект, она знает все про тип в момент компиляции

Добавлено через 5 минут и 30 секунд
http://codepad.org/IJ77LkRS


PM MAIL   Вверх
Logo
Дата 15.3.2012, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 1
Всего: 10



В примере в явно задается тип унаследованого сласса, а класов, наследующих базовый класс несколько.
PM MAIL   Вверх
Logo
Дата 15.3.2012, 03:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 1
Всего: 10



Тоесть, нужна такая архитектура
Код

class Parent {
  static createObject(параметры) {}
}

class Child1 : public Parent {

}

class Child2: public Parent {

}

int main() {
  Child1 *ch1;
  Child2 *ch2;
  ch1 = Child::createObject();
  ch2 = Child::createObject(); 
}

PM MAIL   Вверх
Severyanin
Дата 15.3.2012, 03:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

Репутация: нет
Всего: 9



Можно создавать экземпляр родительского класса, а потом в наследнике приводить его явно к классу этого наследника


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
borisbn
Дата 15.3.2012, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Logo @  15.3.2012,  03:29 Найти цитируемый пост)
 static createObject(параметры) {}

что должна возвращать эта функция ? должна ли она знать о наследниках ? если ответ на второй вопрос - да - то это вообще неправильно.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 15.3.2012, 09:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Logo @  15.3.2012,  03:29 Найти цитируемый пост)
Тоесть, нужна такая архитектура

Такая не получится. А вот такая - получится:
Код

class Parent {
 template<class Child> 
 static void createObject(Child* &ret, параметры) {}
}
class Child1 : public Parent {
}
class Child2: public Parent {
}
int main() {
  Child1 *ch1;
  Child2 *ch2;
  Parent::createObject(ch1);
  Parent::createObject(ch2); 
}

PM MAIL   Вверх
baldina
Дата 15.3.2012, 11:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



кажется, ТС интересует прежде всего
Цитата(Logo @  14.3.2012,  16:55 Найти цитируемый пост)
Она должна наследоваться

видимо подразумевается переопределение в дочерних классах и полиморфное поведение. увы, весь полиморфизм такого рода возможен только на стадии компиляции. туплю smile см. пример xvr
но то же самое можно сделать проще и понятней: просто поместите код createObject() в конструктор, а при необходимости управлять размещением переопределите operator new()

Это сообщение отредактировал(а) baldina - 15.3.2012, 11:02
PM MAIL   Вверх
Logo
Дата 15.3.2012, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 1
Всего: 10



Цитата

что должна возвращать эта функция ? должна ли она знать о наследниках ? если ответ на второй вопрос - да - то это вообще неправильно.

Указатель на созданый обьект, как уже написал. Должна знать о его типе, а также о некоторых полях, которые как бэ абстрактные. Что тут неправильного?

Цитата

но то же самое можно сделать проще и понятней: просто поместите код createObject() в конструктор, а при необходимости управлять размещением переопределите operator new()

Да, может быть оператор replacement new будет самым подходящим решением. Либо родительский класс будет на основе шаблона, надо хорошо обдумать...
Функция как раз принимает параметры, на основе которых вычисляет размещение обьекта в памяти, и возвращает указатель на него.
Правда есть еще другая типа void функция, которая делает тоже самое (вызывает эту функцию), только еще вызывает метод обьекта, который определен как раз в наследниках, и обрабатывает область памяти. Хотя может и ну ее (new(myParams) Object)->run(myParams) не слишком усложнит код, тоже вариант...
PM MAIL   Вверх
borisbn
Дата 15.3.2012, 14:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Logo @  15.3.2012,  14:21 Найти цитируемый пост)
Что тут неправильного?

Зачем базовому классу знать о наследниках ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Logo
Дата 15.3.2012, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 1
Всего: 10



Цитата

Да, может быть оператор replacement new будет самым подходящим решением.

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

Цитата

Зачем базовому классу знать о наследниках ?

Например виртуальные методы.
PM MAIL   Вверх
borisbn
Дата 15.3.2012, 15:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Logo @  15.3.2012,  15:39 Найти цитируемый пост)
Например виртуальные методы. 

Не понял.
Я так понимаю: у базового класса есть свои виртуальные методы. О них обязан знать наследник. А вот чтобы базовый что-то знал о наследнике - ерунда какая-то... не понимаю.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
baldina
Дата 15.3.2012, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Logo @  15.3.2012,  14:21 Найти цитируемый пост)
Указатель на созданый обьект, как уже написал. Должна знать о его типе, а также о некоторых полях, которые как бэ абстрактные. 

пока работает конструктор, объект не создан полностью, и к виртуальным функциям обращаться нельзя. это и не нужно, т.к. конструктор и так всегда знает, какой тип он конструирует. точно так же об этом знает любая функция, создающая объект. 
когда объект создан полностью, его тип не важен, т.к. доступны виртуальные методы.

и вообще, см. паттерн factory.

PM MAIL   Вверх
Logo
Дата 15.3.2012, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 1
Всего: 10



Цитата

пока работает конструктор, объект не создан полностью, и к виртуальным функциям обращаться нельзя. это и не нужно, 

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

Код

template <class TChild> 
class Parent {
public:
  void *operator new(size_t size, void* ptr) {
    printf("VAR %d", TChild::VAR);
    return ptr;
  }
};

class Child : public Parent<Child> {
public:
  static const long VAR = 10; //как бы абстрактное статическое поле из Parent, константа
};

int main() {
  int test;
  void* memory = &test;
  Child *c = new(memory) Child;
}

PM MAIL   Вверх
mes
Дата 15.3.2012, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Logo, а что в конце из этого статически виртуального винегрета должно получиться то ?



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0627 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.