Привет, Я начинаю C++, и теперь я ищу решение указателя. Сначала я пишу исходный код, потому что мои навыки описания английского слишком плохие. (Спасибо, переводчик Google!) Это мой пример кода.C++: указатель на наследование векторов и классов
#include <iostream>
#include <vector>
using namespace std;
class UNIT
{
public :
struct OBJ
{
float x,y,z;
};
vector<OBJ> obj;
virtual void add(int x,int y,int z)=0;
virtual void size()=0;
};
class KNIGHT : public UNIT
{
public :
struct OBJ
{
float x,y,z;
};
vector<OBJ> obj;
void add(int x,int y,int z)
{
OBJ sample;
sample.x=x;
sample.y=y;
sample.z=z;
obj.push_back(sample);
}
void size()
{
cout << obj.size() << endl;
}
};
int main()
{
KNIGHT knight;
KNIGHT::OBJ sample_knight;
UNIT* pt = &knight;
pt->add(11,22,33);
knight.obj.push_back(sample_knight);
pt->size();
cout << pt->obj.size() << endl;
getchar();
return 0;
}
И результат
2
0
(Если я получить доступ в Рыцарского 'переменных сек любит PT-> OBJ [0] .x непосредственно, это может вызвать' линию 932 из диапазона ')
Из этого эксперимента я извлек следующие результаты.
- БЛОКА * пт не указывает на вектор OBJ KNIGHT «s.
- Но БЛОКА * пт можно использовать KNIGHT «s добавить() и размер().
- Возможно, это связано с наследованием между UNIT и KNIGHT.
Кроме того, я попытался PT-> obj.push_back() (В этом случае образец БЛОКА :: OBJ) и печать PT-> obj.size(), это показало мне повышенную ценность. Но pt-> size() был таким же, как раньше. Я ожидаю, что это где-то вызовет проблемы, и оно бесполезно, потому что оно не связано с KNIGHTadd() и размер().
Итак, сделаем вывод.
How can I get vector<OBJ> of KNIGHT(not UNIT) in directly, with UNIT* pointer or something?
※ Я буду использовать это в функции выбора персонажа.
, например:
struct CHAR_LIST
{
int type,num;
};
UNIT* Select_Unit(int type)
{
switch(type)
{
case CHAR_KNIGHT :
{
return &knight;
}
case CHAR_ARCHER :
{
return &archer;
}
}
}
vector<CHAR_LIST> char_list;
UNIT* pt;
for (int num=0; num<char_list.size(); num++)
{
pt = Select_Unit(char_list[num].type);
pt->obj[char_list[num].num].x+=10;
pt->obj[char_list[num].num].y=0;
}
Обратите внимание, что если вы на самом деле предназначены, чтобы скрыть унаследованные имена, вы можете получить доступ к базовой версии, делая что-то вроде 'БЛОКА :: obj' доступ к версии базового класса внутри производный класс. (Замените 'UNIT' каким бы базовым именем, конечно) –