Не работает конструктор!

Тема в разделе "Общие вопросы по С и С++", создана пользователем mahsus, 6 янв 2008.

  1. mahsus

    mahsus Гость

    Здравствуйте!
    Почему-то не работает конструктор:

    Код (Text):
    #include <vector>
    #include <string>
    typedef vector<string*> string_list;
    typedef vector<Player*> player_list;

    class Player{
    public:
    Player();
    ~Player();
    private:
    object_list *ObjectList;
    };

    class Generals{
    public:
    Generals();
    ~Generals();
    private:
    string_list *AccessList;
    player_list *PlayerList;
    };

    Generals::Generals()
    {
    PlayerList=new player_list(); //здесь не может создать лист
    AccessList=new string_list();
    }
    Generals::~Generals()
    {
    delete AccessList;
    delete PlayerList;
    } //*
    при компиляции выдает предупреждения типа
    warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > * *,std::basic_string<char,std::char_traits<char>
    ,std::allocator<char> > *,std::basic_string<char,std::char_traits<char>,std::allocator<char> > * &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > * *,int>' : identifier was truncated to '255' characters in the debug information
    и ссылается на строку //* и на файл V98\Include\vector:
    explicit vector(const _A& _Al = _A())
    : allocator(_Al), _First(0), _Last(0), _End(0) {}
    при запуске не может создать PlayerList.
    Поделитесь пожалуйста знаниями по контейнерным классам.
     
  2. kindkaktus

    kindkaktus New Member

    Регистрация:
    6 янв 2008
    Сообщения:
    3
    Симпатии:
    0
    На ворнинг забей или гаси ее #pragma warning( disable: 4786 ).
    По коду не ясно что где не создается. Приведи минимальный код, воспроизводящий проблему

    -- Андрей
     
  3. mahsus

    mahsus Гость

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

    Код (Text):
    #ifndef MILIT_H
    #define MILIT_H
    #include <vector>
    #include <string>
    using namespace std;

    #define MAX_CAPITAL         10000
    #define MAX_INTERVAL        1000

    class MilitUnit; class BuildUnit;
    class Player; class Object;

    typedef int money_ty;
    typedef int index_ty;
    typedef vector<int> int_list;
    typedef vector<string*> string_list;
    typedef vector<Player*> player_list;
    typedef vector<Object*> object_list;
    //************************************************************
    class Player{
    public:
    Player();
    ~Player();
    private:
    money_ty CurrMoney;
    object_list *ObjectList;
    };
    //************************************************************
    class Object{
    public:
    virtual int ToDo()=0;
    virtual void Show()=0;
    protected:
    int_list *AccessList;
    int_list *CoeffList;
    string Name;
    int Health;
    Object *Purpose;
    int RemainTime;
    bool Prepare;
    bool FireAbility;
    int Number;
    };
    //************************************************************
    class BuildUnit:public Object{
    public:
    virtual int ToDo()=0;
    virtual void Show()=0; 
    };
    //************************************************************
    class MilitUnit:public Object{
    public:
    virtual int GetFirePower(){return FirePower;}
    virtual int ToDo()=0;
    virtual void Show()=0;
    protected:
    int FirePower;
    };
    //************************************************************
    //GAME
    class Generals{
    public:
    Generals();
    ~Generals();
    private:
    string_list *AccessList;
    player_list *PlayerList;
    int CurrPlayer;
    };
    //************************************************************
    //военные единицы
    //************************************************************
    //Танк
    class Tank: public MilitUnit{
    public:
    Tank();
    ~Tank();
    int ToDo();
    void Show();
    protected:
    int FirePower;
    };
    //************************************************************

    #endif

    здесь реализация классов, тоже кратко

    #include "milit.h"
    #include <vector>
    #include <iostream>
    #include <windows.h>
    #include <time.h>
    #include <string>
    #include <stdlib.h>
    using namespace std;

    class Object; class Player;

    typedef vector<string*> string_list;
    typedef vector<Player*> player_list;
    typedef vector<Object*> object_list;

    string NAME[10]={"Тракторный завод",
    "Военный завод",
    "Барак",
    "Аэропорт",
    "Экскаватор",
    "Танк",
    "Ракетница",
    "Бронетранспортер",
    "Истребитель",
    "Пехотинец"};

    int FIRE_POWER[10]= {0,0,0,0,0,6,11,5,10,3};
    int REMAIN_TIME[10]={30,20,15,20,7,6,10,5,10,3};
    int HEALTH[10]=     {800,600,500,400,300,300,150,250,150,100};

    int DIPPER_FACTORY_COEFF[10]    ={0,0,0,0,1,0,0,0,0,0};
    int MILITARY_FACTORY_COEFF[10]  ={0,0,0,0,0,1,1,1,0,0};
    int BARRACKS_COEFF[10]          ={0,0,0,0,0,0,0,0,0,1};
    int AIRPORT_COEFF[10]           ={0,0,0,0,0,0,0,0,1,0};
    int DIPPER_COEFF[10]            ={1,1,1,1,0,0,0,0,0,0};
    int TANK_COEFF[10]              ={6,7,8,8,7,6,6,3,0,3};
    int ROCKET_COEFF[10]            ={10,11,13,13,10,10,10,10,0,5};
    int TROOP_CARRIER_COEFF[10]     ={4,5,6,6,6,5,6,4,9,10};
    int FLY_FIGHTER_COEFF[10]       ={10,12,14,14,10,10,10,10,8,6};
    int INFANTRY_COEFF[10]          ={2,3,4,4,1,2,6,3,0,9};


    //************************************************************
    //PLAYER
    Player::Player()
    {
    CurrMoney=MAX_CAPITAL;
    ObjectList=new object_list();
    Object *obj=CreateObject(0);
    ObjectList->push_back(obj);
    obj->SetPrepare(true);
    }
    Player::~Player()
    {
    delete ObjectList;
    }
    //************************************************************
    //OBJECT
    void Object::Show()
    {
    cout<<GetShowString();
    }
    string &Object::GetShowString()const
    {
    string s="";
    s+=Name;
    s+=": Здоровье: ";
    char ch[5];
    s+=string(itoa(Health,ch,10));
    s+="Цель: ";
    if (Purpose) s+=Purpose->GetName();
    else s+="нет цели";       
    return s;
    }
    //************************************************************
    //BUILDUNIT
    int BuildUnit::ToDo()
    {
    if (IsPrepare() && IsPurpose())
    if (!Purpose->DecRemainTime()) {SetPurpose(NULL);}
    return 1; //объект не надо удалять
    }
    void BuildUnit::Show()
    {
    Object::Show();
    }
    //************************************************************
    //MILITUNIT
    int MilitUnit::ToDo()
    {  
    if (IsPrepare() && IsPurpose()) {
    int fire_pow=GetFirePower();
    fire_pow*=Purpose->GetCoeffList()[Purpose->GetNumber()];
    if (Purpose->GetHealth()<=fire_pow) {
    //объект готов к удалению
    Purpose->SetHealth(0);
    return 0;
    }
    else Purpose->SetHealth(Purpose->GetHealth()-GetFirePower());  
    }
    return 1;
    }
    void MilitUnit::Show()
    {
    Object::Show();
    }
    //************************************************************
    //GAME
    Generals::Generals()
    {
    CurrPlayer=0;
    PlayerList=new player_list();
    AccessList=new string_list();
    for(int i=0;i<10;i++)
    GetAccessList().push_back(&(::NAME[i]));
    }
    Generals::~Generals()
    {
    delete AccessList;
    delete PlayerList;
    }
    //************************************************************
    //военные единицы
    //************************************************************
    //Танк
    Tank::Tank()
    {
    Number=5;
    Name=NAME[GetNumber()];
    Purpose=NULL;
    FirePower=FIRE_POWER[GetNumber()];
    Health=HEALTH[GetNumber()];
    Prepare=false;
    RemainTime=REMAIN_TIME[GetNumber()];
    FireAbility=true;
    AccessList=new int_list();
    for(int i=0;i<10;i++)AccessList->push_back(i);
    for(i=0;i<10;i++)CoeffList->push_back(::TANK_COEFF[i]);
    }
    Tank::~Tank(){delete AccessList;}
    int Tank::ToDo(){return MilitUnit::ToDo();}
    void Tank::Show(){MilitUnit::Show();}

    //************************************************************
     
  4. kindkaktus

    kindkaktus New Member

    Регистрация:
    6 янв 2008
    Сообщения:
    3
    Симпатии:
    0
    Ты пишешь
    Код (Text):
    PlayerList=new player_list(); //здесь не может создать лист
    Что имеется ввиду под "не может создать лист"?
    Для создания пустого контейнера указателей, достаточно и неполного типа указателя, то есть нет необходимости приводить код реализации всех классов.
     
  5. mahsus

    mahsus Гость

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

    kindkaktus New Member

    Регистрация:
    6 янв 2008
    Сообщения:
    3
    Симпатии:
    0
    При создании пустого конейнера указателей (например, вызов конструктора по умолчанию для контейнера) не происходит никаких вызовов контрукторов для классов, указателями на которые параметризуется данный контейнер. То есть ты можешь написать
    Код (Text):
    #include <vector>

    class some_type;
    typedef std::vector<some_type*> some_type_ptr_container;

    int main()
    {
    some_type_ptr_container v;
    //или
    some_type_ptr_container* pv = new some_type_ptr_container();
    return 0;
    }
    не определяя some_type.

    Чем поведение приведенного тобой в первоначальном сообщении кода отличается от поведения вышеприведенного кода?
     
Загрузка...

Поделиться этой страницей