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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как вызвать конструктор предка не зная кто предок? 
V
    Опции темы
boostcoder
Дата 12.10.2010, 04:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



всем доброго утра.
каким образом можно вызвать конструктор базового класса не зная кто предок?
код:
Код

#include <iostream>

struct base {
   base(int) {}
   virtual void function() = 0;
};

// в этом классе конструктора быть не может.
struct derived: base {
   virtual void function() {
   }
};

struct any {
   any(int v):_derived(new derived(v)) // аргумент нужно передать предку.
   {}

   derived* _derived;
};

int main() {
   any any(1);
}

http://liveworkspace.org/code/9c0aa5263526...22d9cf0e0da1e70

спасибо.
PM WWW   Вверх
azesmcar
Дата 12.10.2010, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



конструктор предка должен вызываться из конструктора derived, но этого не происходит. Но у класса derived нет default конструктора (так как компилятор не знает как его сгенерировать) и другого тоже нет. Можно решить через обыкновенную функцию, которую derived унаследует от базового класса а конструктор оставить default, чтобы компилятор мог его генерировать для наследников без каких либо проблем.

что-то вроде этого
http://liveworkspace.org/code/5593f2deabab...e404db3d33b550c

Цитата(boostcoder @  12.10.2010,  04:50 Найти цитируемый пост)
// в этом классе конструктора быть не может.

Это не совсем понятно. Что значит не может? Нельзя писать или его действительно быть не должно? Это немного разные вещи, так как если его действительный быть не должно то как будет создаваться объект?



Это сообщение отредактировал(а) azesmcar - 12.10.2010, 05:30
PM   Вверх
boostcoder
Дата 12.10.2010, 05:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(azesmcar @  12.10.2010,  05:28 Найти цитируемый пост)
Что значит не может? Нельзя писать или его действительно быть не должно?

класс i_type генерирует метагенератор. как видно, в этом классе, публичные, только чистовиртуальные методы. наследуясь от него, юзер их должен реализовать. не хочется на юзера вешать реализацию того, что ему не нужно(писать конструктор, инициализировать предка, и т.д..). т.е. хочу скрыть от него все остальное.

Цитата(azesmcar @  12.10.2010,  05:28 Найти цитируемый пост)
так как если его действительный быть не должно то как будет создаваться объект?

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

Цитата(azesmcar @  12.10.2010,  05:28 Найти цитируемый пост)
что-то вроде этого
http://liveworkspace.org/code/5593f2deabab...e404db3d33b550c

хм... именно этого я и хотел избежать.
есть еще варианты?
PM WWW   Вверх
azesmcar
Дата 12.10.2010, 06:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



в новом стандарте можно вот так
Код

struct derived: base {
   using base::base;
   virtual void function() {
   }
};


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


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


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

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



Цитата(boostcoder @  12.10.2010,  04:38 Найти цитируемый пост)
класс i_type генерирует метагенератор.  как видно, в этом классе, публичные, только чистовиртуальные методы. 
судя по всему это продолжние темы о rpc, и класс i_type это база пакета протокола..

Но позвольте какие виртуальные методы, и вообще что за база ?! зачем загружать пользователя ?



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 12.10.2010, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(mes @  12.10.2010,  08:30 Найти цитируемый пост)
судя по всему это продолжние темы о rpc

 smile 

Цитата(mes @  12.10.2010,  08:30 Найти цитируемый пост)
и класс i_type это база пакета протокола

 smile 

Цитата(mes @  12.10.2010,  08:30 Найти цитируемый пост)
зачем загружать пользователя ?

на стороне сервера кто-то же должен реализовать обработчики.
PM WWW   Вверх
mes
Дата 12.10.2010, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  12.10.2010,  07:51 Найти цитируемый пост)
на стороне сервера кто-то же должен реализовать обработчики. 

и при чем тут виртуальные методы пакета протокола ?!


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 12.10.2010, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



вы меня не правильно поняли..возможно..
сейчас я занимаюсь именно связыванием типов команд, с их обработчиками.
или что?..
PM WWW   Вверх
mes
Дата 12.10.2010, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  12.10.2010,  08:11 Найти цитируемый пост)
сейчас я занимаюсь именно связыванием типов команд, с их обработчиками.
или что?.. 

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



Это сообщение отредактировал(а) mes - 12.10.2010, 09:15


--------------------
PM MAIL WWW   Вверх
baldina
Дата 12.10.2010, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

по идеи достаточно должно быть интерфейса базового класса.. 

 smile 
PM MAIL   Вверх
boostcoder
Дата 12.10.2010, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(azesmcar @ 12.10.2010,  06:43)
в новом стандарте можно вот так
Код

struct derived: base {
   using base::base;
   virtual void function() {
   }
};

вот что говорит:
Цитата

error: 'base::base' names constructor

как понимать?

Добавлено через 1 минуту и 25 секунд
Цитата(mes @ 12.10.2010,  09:14)
Цитата(boostcoder @  12.10.2010,  08:11 Найти цитируемый пост)
сейчас я занимаюсь именно связыванием типов команд, с их обработчиками.
или что?.. 

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

чуть позже..
PM WWW   Вверх
mes
Дата 12.10.2010, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  12.10.2010,  09:58 Найти цитируемый пост)
чуть позже..

ну вот.. опять ждать smile
 smile 


--------------------
PM MAIL WWW   Вверх
baldina
Дата 12.10.2010, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(boostcoder @  12.10.2010,  10:58 Найти цитируемый пост)
Цитата(azesmcar @ 12.10.2010,  06:43)
в новом стандарте можно вот так
код C++
1:
2:
3:
4:
5:
struct derived: base {
   using base::base;
   virtual void function() {
   }
};

вот что говорит:
Цитата

error: 'base::base' names constructor


Даже Comeau так не умеет. Кстати, в текущем draft я такой фичи не нашел...
PM MAIL   Вверх
boostcoder
Дата 12.10.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(baldina @  12.10.2010,  12:10 Найти цитируемый пост)
Кстати, в текущем draft я такой фичи не нашел... 

я даже не искал. ибо не знаю что искать smile 
PM WWW   Вверх
azesmcar
Дата 12.10.2010, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Цитата(boostcoder @  12.10.2010,  10:58 Найти цитируемый пост)
как понимать?

на то он и новый стандарт smile 

http://gcc.gnu.org/gcc-4.5/cxx0x_status.html
Цитата

Inheriting constructors - No

N2540

Цитата(boostcoder @  12.10.2010,  12:32 Найти цитируемый пост)
я даже не искал. ибо не знаю что искать smile  


Цитата(baldina @  12.10.2010,  12:10 Найти цитируемый пост)
Кстати, в текущем draft я такой фичи не нашел... 

12.9 Inheriting Constructors
текущий черновик


Это сообщение отредактировал(а) azesmcar - 12.10.2010, 12:49
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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