Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Почему не срабатывает конструктор?


Автор: KaraKum 21.3.2008, 09:37
Доброе время суток.
У меня такая проблема:
В одном .cpp файле располагается код функции WinMain() и всё что обязятельно для любой проги.
В .h файле находятся объявления классов.
В другом .cpp файле располагаются определения функций классов и вот его код:
Код

void CController::FirstInitializations()
{
    sTempPointers.ptrTank1 = new CTank1(3, 0, -5);
    sTempPointers.ptrTank1->Constructor(3, 0, -5);
}

//CTank1 /////
CTank1::CTank1(double extXCoord, double extYCoord, double extZCoord)
{
    sSpaceObjects.cTank1Existing = true;
    sSpaceObjects.ptrTank1 = sTempPointers.ptrTank1;

    XCoord = extXCoord;    YCoord = extYCoord;    ZCoord = extZCoord;
    DrawYourself();
}

void CTank1::Constructor(double extXCoord, double extYCoord, double extZCoord)
{
    sSpaceObjects.cTank1Existing = true;
    sSpaceObjects.ptrTank1 = sTempPointers.ptrTank1;

    XCoord = extXCoord;    YCoord = extYCoord;    ZCoord = extZCoord;
    DrawYourself();
}

Проблема в том, что при создании объекта типа CTank1 не вызывается его конструктор. Я думал, что проблема может быть в разбиении проги на разные файлы и создал функцию Constructor, которая полностью идентична конструктору, так вот она вызывается и значения инициализируются, а если не вызывать Constructor(), то при обращении к переменным XCoord, YCoord и ZCoord прога вылетает, то есть эти переменные не инициализированы.
Подскажите, пожалуйста, в чём проблема?

Автор: Lazin 21.3.2008, 09:58
Цитата(KaraKum @  21.3.2008,  09:37 Найти цитируемый пост)
Проблема в том, что при создании объекта типа CTank1 не вызывается его конструктор.

если объект создается, то полюбому вызывается, поставь брэйкпоинт в конструктор и проверь, если не веришь

что такое sTempPointers? возможно проблема здесь...

Автор: Alek86 21.3.2008, 10:07
KaraKum, сколько у тебя конструкторов определено?
если только этот, то он обязан вызваться

Автор: baldina 21.3.2008, 10:20
KaraKum, мы не телепаты. Весь код в студию.
Если вообще не вызывается, возможно у тебя больше одного объекта определено (например, если определение объекта в .h).

Автор: Graf_h 21.3.2008, 10:27
Покажи хедер и срр, тогда можно будет об чем то говорить

Автор: baldina 21.3.2008, 10:38
Цитата

    sTempPointers.ptrTank1 = new CTank1(3, 0, -5);


Вот тут 100%-но вызывается, только какой конструктор для какого  sTempPointers?

Автор: KaraKum 21.3.2008, 14:19
У меня такая система файлов в проге: есть файл "Includes.h" в котором находятся все файлы, которые нужно подключить к программе (этот файл подключён к "WinMain.cpp"); для функций и классов по два файла: "Functions.h/.cpp" и "Classes.h/.cpp" - все .h файлы подключены к файлу "Includes.h".
Вот файл "Classes.h":
Код

#ifndef CLASSES_H
#define CLASSES_H

class CController
{
public:
    void FirstInitializations();
    void NextStep();
};

class CTank1
{
public:
    CTank1(double extXCoord, double extYCoord, double extZCoord);
    void Constructor(double extXCoord, double extYCoord, double extZCoord);
    void DrawYourself();
    void SetActive();
    void ResetActive();

private:
    double XCoord, YCoord, ZCoord;
};

#endif


И вот "Classes.cpp":
Код

void CController::FirstInitializations()
{
    sTempPointers.ptrTank1 = new CTank1(3, 0, -5);
    sSpaceObjects.cTank1Existing = true;
    sTempPointers.ptrTank1->Constructor(3, 0, -5);
}

void CController::NextStep()
{
    if(sSpaceObjects.cTank1Existing) sSpaceObjects.ptrTank1->DrawYourself();
}

//CTank1 /////
CTank1::CTank1(double extXCoord, double extYCoord, double extZCoord)
{
    sSpaceObjects.cTank1Existing = true;
    sSpaceObjects.ptrTank1 = sTempPointers.ptrTank1;

    XCoord = extXCoord;    YCoord = extYCoord;    ZCoord = extZCoord;
    DrawYourself();
}

void CTank1::Constructor(double extXCoord, double extYCoord, double extZCoord)
{
    sSpaceObjects.cTank1Existing = true;
    sSpaceObjects.ptrTank1 = sTempPointers.ptrTank1;

    XCoord = extXCoord;    YCoord = extYCoord;    ZCoord = extZCoord;
    DrawYourself();
}


void CTank1::DrawYourself()
{ //здесь длинный код рисования
}

Функция CTank1.Constructor() вызывается и происходит успешная инициализация переменных XCoord... Но если не вызывать эту функцию, то прога при рисовании этого объекта (так как функция DrawYourself() обращается к этим переменным) вылетает.

Цитата

что такое sTempPointers? возможно проблема здесь...

Это структура, которая хранит указатель на первый объект списка объектов типа CTank1. И она удачно получает указатель на объект, так как в функции cController.NextStep() вызывается функция DrawYourself() именно с помощью этого указателя.

В чём проблема?

Автор: Earnest 21.3.2008, 14:36
Цитата(KaraKum @  21.3.2008,  10:37 Найти цитируемый пост)
 sSpaceObjects.ptrTank1 = sTempPointers.ptrTank1;

Скорее всего, здесь проблема: в этой точке (в конструкторе) указатель еще не определен, а ты его уже используешь (присваиваешь). Делаю этот вывод из кода вызова:
Цитата(KaraKum @  21.3.2008,  10:37 Найти цитируемый пост)
sTempPointers.ptrTank1 = new CTank1(3, 0, -5);

Низя так:  в sTempPointers.ptrTank1 еще мусор. Но можно написать в конструкторе sSpaceObjects.ptrTank1 = this.

Автор: vinter 21.3.2008, 14:40
че то я не понял, ты присваеваешь указатель в конструкторе, который должен быть проинициализирован после вызова оного?
Цитата

sTempPointers.ptrTank1 = new CTank1(3, 0, -5);

Цитата

 sSpaceObjects.ptrTank1 = sTempPointers.ptrTank1;

объясни как строчки выше могут согласоваться???

Автор: KaraKum 21.3.2008, 14:55
Цитата(Earnest @ 21.3.2008,  14:36)
Цитата(KaraKum @  21.3.2008,  10:37 Найти цитируемый пост)
 sSpaceObjects.ptrTank1 = sTempPointers.ptrTank1;

Скорее всего, здесь проблема: в этой точке (в конструкторе) указатель еще не определен, а ты его уже используешь (присваиваешь). Делаю этот вывод из кода вызова:
Цитата(KaraKum @  21.3.2008,  10:37 Найти цитируемый пост)
sTempPointers.ptrTank1 = new CTank1(3, 0, -5);

Низя так:  в sTempPointers.ptrTank1 еще мусор. Но можно написать в конструкторе sSpaceObjects.ptrTank1 = this.

Именно!
Просто переместил операцию sSpaceObjects.ptrTank1 = sTempPointers.ptrTank1; в функцию CController::FirstInitializations(); и всё заработало!
Спасибо за помощь. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)