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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему не срабатывает конструктор? Коструктор определён но не вызывается 
V
    Опции темы
KaraKum
  Дата 21.3.2008, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Доброе время суток.
У меня такая проблема:
В одном .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 прога вылетает, то есть эти переменные не инициализированы.
Подскажите, пожалуйста, в чём проблема?
PM MAIL WWW   Вверх
Lazin
Дата 21.3.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



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

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

что такое sTempPointers? возможно проблема здесь...
PM MAIL Skype GTalk   Вверх
Alek86
Дата 21.3.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



KaraKum, сколько у тебя конструкторов определено?
если только этот, то он обязан вызваться


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


Эксперт
****


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

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



KaraKum, мы не телепаты. Весь код в студию.
Если вообще не вызывается, возможно у тебя больше одного объекта определено (например, если определение объекта в .h).
PM MAIL   Вверх
Graf_h
Дата 21.3.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Покажи хедер и срр, тогда можно будет об чем то говорить


--------------------
Иногда переменная - это просто переменная
PM MAIL ICQ   Вверх
baldina
Дата 21.3.2008, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

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


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

Это сообщение отредактировал(а) baldina - 21.3.2008, 10:39
PM MAIL   Вверх
KaraKum
  Дата 21.3.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У меня такая система файлов в проге: есть файл "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() именно с помощью этого указателя.

В чём проблема?
PM MAIL WWW   Вверх
Earnest
Дата 21.3.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(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.


--------------------
...
PM   Вверх
vinter
Дата 21.3.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



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

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

Цитата

 sSpaceObjects.ptrTank1 = sTempPointers.ptrTank1;

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


--------------------
Мой блог
PM MAIL WWW   Вверх
KaraKum
Дата 21.3.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(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 

Это сообщение отредактировал(а) KaraKum - 21.3.2008, 14:55
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.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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