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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> наследование класса.вызов функции перед, конструктором наследующего класса 
V
    Опции темы
DarkKnight
  Дата 14.10.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток!
Допустим есть класс А и класс B.У класса Б не дефолтный конструктор,с чем справляюсь успешно,проблема в том,что при вызове конструктора(оператора new) наследующего класса нужно вызвать его конструткор,потом внутренюю приватную функцию,и потом только конструктор наследуемого класса.Т.е.:
1.вызываем конструктор класса А
2. вызываем функцию
3. вызываем конструткор класса Б

Код

class A: public B
{
      A(int gggg)
      : _abc(gggg) //та самая функция
      : B(gggg)
     {
          //null
      }
     ~A()
     {
          // null
      }
private:
      bool _abc(int a);
};


Нужно что-то типа этого.Такое вообще реально?
PM MAIL ICQ   Вверх
Daevaorn
Дата 14.10.2008, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 51
Всего: 70



Цитата(DarkKnight @  14.10.2008,  23:05 Найти цитируемый пост)
Такое вообще реально? 

так как вы описали нет.

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

Это сообщение отредактировал(а) Daevaorn - 15.10.2008, 16:51
PM MAIL WWW   Вверх
J0ker
Дата 14.10.2008, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 4
Всего: 14



так сделать нельзя
конструкторы вызываются от предка к потомку
и в списке инициализации может быть только инициализация мемберов (ну и предков)

Добавлено через 1 минуту и 46 секунд
если вы точно опишите проблему - зачем это нужно - возможно мы сможем предложить вам более удобный дизайн - публичное наследование далеко не всегда правильное решение


--------------------
user posted image
PM MAIL   Вверх
DarkKnight
Дата 15.10.2008, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



в общем суть проблемы:
1.нужно выделить пул в памяти
2.заполнить структуру с параметрами
3.вызвать конструктор класса B с передачей в него этой сруктуры.
Конкретнее - это инсталяция Хавока.
Мне нужно уместить все эти 3 действия в 1 функцию,желательно без передачи структуры в конструткор класса А(в нем и должна быть эта функция,а лучше - этой функцией должен быть его конструктор),при этом унаследовать все методы класса B.

Это сообщение отредактировал(а) DarkKnight - 15.10.2008, 08:32
PM MAIL ICQ   Вверх
maxim1000
Дата 15.10.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ну так можно сделать статическую функцию, которая вернёт структуру для инициализаиции B:

Код

A(int ggg): B(func(qqq)) {}



--------------------
qqq
PM WWW   Вверх
DarkKnight
Дата 15.10.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



попробывал,эта функция даже не успевает вызваться(
PM MAIL ICQ   Вверх
DarkKnight
Дата 15.10.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В общем я написал 2 класса - менеджер памяти и класс мира.
но если есть идеи по этой теме,буду раз прочитать и испробывать)
PM MAIL ICQ   Вверх
maxim1000
Дата 15.10.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(DarkKnight @  15.10.2008,  16:35 Найти цитируемый пост)
попробывал,эта функция даже не успевает вызваться( 

а можно код привести?
а то уж очень странно, что функция не вызывается


--------------------
qqq
PM WWW   Вверх
DarkKnight
Дата 15.10.2008, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вызываться то она вызывается,но после вызова конструктора класса B,а нужно до. По сути так и должно быть,следуя логике кода - вызов функции из класса A.но т.к. конструктор класса А не вызван еще,она видимо игнорируется(функция),вызов конструктора класса B,вызов конструктора класса A.

код был такой(образно):
Код

class A : public B
{
public:
    A(int nn);
   ~A() 
      {
         // null
      };
protected:
     int _myfunc(int gg);
};

A::A(int nn) : B( _myfync(nn) )
{
     // null
}

int A::_myfunc(int gg)
{
     // тут у меня заполнялась структура и
     // стоял брэкпоинт, т.к. вылет
     // (который обычно происходит если не выделить блок памяти хавоку)
     // происходил до брэкпоинта,я решил что вызов функции
     // просто не происходил
     return gg;
}


PM MAIL ICQ   Вверх
maxim1000
Дата 15.10.2008, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(DarkKnight @  15.10.2008,  18:59 Найти цитируемый пост)
Код
class A : public B
{
public:
    A(int nn);
   ~A() 
      {
         // null
      };
protected:
     int _myfunc(int gg);
};

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

Цитата(DarkKnight @  15.10.2008,  18:59 Найти цитируемый пост)
     // тут у меня заполнялась структура и
     // стоял брэкпоинт, т.к. вылет
     // (который обычно происходит если не выделить блок памяти хавоку)
     // происходил до брэкпоинта,я решил что вызов функции
     // просто не происходил

для отладки я бы посоветовал использовать какие-нибудь более детерминированные события, чем вылет smile
вывод на консоль, например, или MessageBox, если дело в Windows происходит



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


Новичок



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

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



Цитата(maxim1000 @  15.10.2008,  21:11 Найти цитируемый пост)
для отладки я бы посоветовал использовать какие-нибудь более детерминированные события, чем вылет вывод на консоль, например, или MessageBox, если дело в Windows происходит

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


Цитата(maxim1000 @  15.10.2008,  21:11 Найти цитируемый пост)
функция подготовки структуры должна быть статической, т.к. на момент вызова конструктора B объекта класса A ещё нету и вызов его нестатического метода - плохая идея

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

З.Ы. я вроде нечайно кномпу репорт нажал,я не спецально,все ок)))
PM MAIL ICQ   Вверх
mes
Дата 16.10.2008, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(DarkKnight @  15.10.2008,  23:11 Найти цитируемый пост)

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

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

Это сообщение отредактировал(а) mes - 16.10.2008, 01:18


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


Опытный
**


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

Репутация: 3
Всего: 22



Цитата(DarkKnight @  15.10.2008,  23:11 Найти цитируемый пост)
если функция раньше пропускалась,то статическая не будет пропускаться?

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


Цитата(DarkKnight @  15.10.2008,  18:59 Найти цитируемый пост)
     // тут у меня заполнялась структура и
     // стоял брэкпоинт, т.к. вылет
     // (который обычно происходит если не выделить блок памяти хавоку)
     // происходил до брэкпоинта,я решил что вызов функции
     // просто не происходил

Не правильно решил, это значит только то, что у тебя программа вылетает до того как управление дойдет до точки останова.
PM MAIL ICQ Jabber   Вверх
DarkKnight
Дата 16.10.2008, 09:07 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сейчас не поленился - переделал немного класс,функцию сделал статической,поставил cout в начале и конце функции и в конструкторе класса A,не вывелось ничего.
PM MAIL ICQ   Вверх
Daevaorn
Дата 16.10.2008, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 51
Всего: 70



DarkKnight
$ cat main.cpp 
Код

#include "iostream"

struct Base
{
    Base(int a)
    {
        std::cout << "Base = " << a << std::endl;
    }
};

struct Derived: public Base
{
    Derived(): Base(foobar(777))
    {
        std::cout << "Derived" << std::endl;
    }
protected:
        static int foobar(int a)
    {
        std::cout << "Foobar = " << a << std::endl;
                return a;
    }
};

int main()
{
    Derived d;
    return 0;
}


Код

$ g++ main.cpp  && ./a.out 
Foobar = 777
Base = 777
Derived

PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0964 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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