2013-09-08 2 views
0

Привет, Я начинаю 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 из диапазона ')

Из этого эксперимента я извлек следующие результаты.

  1. БЛОКА * пт не указывает на вектор OBJ KNIGHT «s.
  2. Но БЛОКА * пт можно использовать KNIGHT «s добавить() и размер().
  3. Возможно, это связано с наследованием между 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; 
} 
+0

Обратите внимание, что если вы на самом деле предназначены, чтобы скрыть унаследованные имена, вы можете получить доступ к базовой версии, делая что-то вроде 'БЛОКА :: obj' доступ к версии базового класса внутри производный класс. (Замените 'UNIT' каким бы базовым именем, конечно) –

ответ

1

У вас есть две разные экземпляры vector<OBJ> obj. Один в базовом классе и один в производном классе. Поскольку KNIGHT публикуется публично с UNIT, он имеет доступ к UNITvector<OBJ> obj и тот, который вы хотите использовать. Вместо этого вы переопределяете его в базовом классе.

В принципе, KNIGHT должен выглядеть следующим образом:

class KNIGHT: public UNIT 
    { 
     public: 
     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; 
     } 
    }; 

Как наблюдение, это не выглядит, как вам нужны функции add и size быть чисто виртуальным (или даже виртуальной), и вы могли бы просто определить их в классе UNIT.Если, однако, вы хотите, чтобы какой-то другой класс имел другое поведение при вызове add или size, тогда вы хотите сохранить их виртуальными.

Я как-то пропустил последнюю строку, где вы действительно задали вопрос. Дело в том, что UNIT* может получить доступ только к классу UNIT. Он не подозревает, что это фактически указывает на объект KNIGHT.

+0

Спасибо за вашу помощь. Мне придется использовать метод, который сбрасывает индивидуальные характеристики с неохотой, если не существует способа. – Jang

2

OBJ и obj в KNIGHT скрыть их в UNIT. Комментарий их и попробовать еще раз:

class KNIGHT : public UNIT 
{ 
public : 
    // struct OBJ 
    // { 
    //  float x,y,z; 
    // }; 
    // vector<OBJ> obj; 
+0

Спасибо за вашу помощь. Конечно, вне диапазона не происходит. Но я хочу, чтобы различные типы единиц имели свои собственные ценности. (Для полиморфизма). Нет ли возможности для структуры OBJ indivisual? – Jang