Форумы Серверы Суспільство
Игры Серверы VBIOS General Soft & Hard Увлечения А поговорить... Культура Полезная информация Межигір'я Чат

Пользователь Сообщение: c++ need Help        (Тема#65699)
6APMALEU 
угорел по хардору
: Киев
С нами с 08.01.09
Посты: 9765
08.08.12 01:24 Ukraine #1399119
есть класс
  • цитата:
class сUnit
{
int level;
public:
сUnit()
{
level=1;
}
virtual сUnit* Attack(сUnit *u)=0;
virtual void Show()=0;
};


есть классы наследники
  • цитата:
class Spear:сUnit
{
int speed;
int attack;
int def;
public:
Spear()
{
attack=10;
def=15;
speed=2;

}
virtual сUnit* Attack(сUnit *u)
{
return (сUnit*)this;
}
virtual void Show()
{
cout<<"S";
}
};
class Swordsman:сUnit
{
int speed;
int attack;
int def;
public:
Swordsman()
{
attack=25;
def=50;
speed=1;
}
virtual сUnit* Attack(сUnit *u)
{
return (сUnit*)this;

}
virtual void Show()
{
cout<<"M";
}
};
class Axefighter:сUnit
{
int speed;
int attack;
int def;
public:
Axefighter()
{
attack=40;
def=10;
speed=3;
}
virtual сUnit* Attack(сUnit *u)
{
return (сUnit*)this;

}
virtual void Show()
{
cout<<"T";
}
};
class Archer:сUnit
{
int speed;
int attack;
int def;
public:
Archer()
{
attack=15;
def=50;
speed=5;
}
virtual сUnit* Attack(сUnit *u)
{
return (сUnit*)this;

}
virtual void Show()
{
cout<<"A";
}
};

есть ещё класс
  • цитата:
#include <iostream>
using namespace std;
#include "Unit.h"
class cField
{
int x,y;
сUnit ***field;
public:
cField()
{
x=20;/shirina polya
y=20;/visota polya
field =new сUnit **[x];
for(int i=0; i<x; ++i)
field [ i ]=new сUnit*[y];
for(int i=0; i<x; ++i)
for(int j=0; j<y; ++j)
{
field[ i ][j]=NULL;
}
}
};

cfield поле для юнитов
x,y размеры данного поля.
Мне надо чтобы указатели моего масива указателей указывали на классы наследники - Archer, Axefighter etc.
Кто знает, помогите плиз...
Вот здесь им присваивают 0
  • цитата:
for(int i=0; i<x; ++i)
for(int j=0; j<y; ++j)
{
field[ i ][j]=NULL;
}
}

а надо чтобы вместо NULL создавался новый обьект одного из классов-наследников. С меня
зы: сорри за нечитабельность и обёмность...
сцобака 
11001100101000
сцобака
С нами с 27.07.07
Посты: 6012
08.08.12 10:01 [Re: 6APMALEU] Ukraine #1399186
Создаёшь массив void и туда пихаешь указатели на классы - в чём проблема?
Весь код читать влом поэтому опишу вкратце:

Code:
class test1 { test1(){} ~test1(){} void run1(){} } class test2 { test2(){} ~test2(){} void run2(){} }



...
Где-то в коде:
Code:
test1 t1; test2 t2; void ** class_massive = new void*[3]; class_massive[0] = &t1; class_massive[1] = &t2;


...
Где-то дальше в коде:
Code:
reinterpret_cast<test1*>(class_massive[0])->run1(); reinterpret_cast<test2*>(class_massive[1])->run2();



как-то так. Это на скорую руку, а вообще тут ещё нужно проверки на исключения ставить, иначе можешь словить вылет и краш программы.
6APMALEU 
угорел по хардору
: Киев
С нами с 08.01.09
Посты: 9765
14.08.12 14:28 [Re: сцобака] Ukraine #1404318
малёхо не так...
Метод поля (field)
void CField::addUnit(CUnit * u,int x, int y)
{
if(x<0 || x> _x || y< 0 || y>_y)
throw new OutOfArrayException("Out of range",u);
if(_field[y][x])
throw new NotEmptyPositionForUnitException("Position Has a unit",u);
_field[y][x] = u;
}
В методах юнита
CWarrior::CWarrior(int team,int health, int attack, int deffense, int speed, int range)
:CUnit(team,health,attack,deffense,speed,range)
{
_attack=true;
}
в мейне
CField f(10,10);
CUnit * w11 = new CWarrior(0,100,50,20,1,1);
f.addUnit(w11,0,0);
Спс за хелпу, но я так увы это не осилил...
Понял, когда препод дал свой код.
Icon Legend Права Настройки темы
Распечатать тему


1039 Просмотры
Реклама
782 сейчас в онлайне
0 пользователей () и 0 скрытых, а также 782 гостей сейчас онлайн.
VBIOS Version 3.0 FINAL | ©1999-2024
Execution time: 0.076 seconds.   Total Queries: 28   Zlib сжатие вкл.
All times are (GMT+3). Current time is 19:46
Top