• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы mahsus
  • Дата начала
M

mahsus

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

Код:
#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.
Поделитесь пожалуйста знаниями по контейнерным классам.
 
K

kindkaktus

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

-- Андрей
 
M

mahsus

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

Код:
#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();}

//************************************************************
 
K

kindkaktus

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

mahsus

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

kindkaktus

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

При создании пустого конейнера указателей (например, вызов конструктора по умолчанию для контейнера) не происходит никаких вызовов контрукторов для классов, указателями на которые параметризуется данный контейнер. То есть ты можешь написать
Код:
#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.

Чем поведение приведенного тобой в первоначальном сообщении кода отличается от поведения вышеприведенного кода?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!