C ++:向量和类继承中的指针

时间:2013-09-08 14:56:40

标签: c++ class pointers inheritance vector

,我是C ++初学者,我现在正在寻找指针的解决方案。我首先编写源代码,因为我对英语的描述技巧太差了。(谢谢你,google翻译!)这是我的代码示例。

#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

(如果我直接访问 KNIGHT 的变量喜欢 pt-&gt; obj [0] .x ,则会导致'932行超出范围')< / p>

从这个实验中,我提取了以下结果。

  1. UNIT * pt 没有指向 KNIGHT 的向量对象。
  2. UNIT * pt 可以使用 KNIGHT 添加()尺寸()。< / LI>
  3. 可能与 UNIT KNIGHT 之间的继承有关。
  4. 另外,我试过 pt-&gt; obj.push_back()(在这种情况下,样本是 UNIT :: OBJ )并打印 pt-&gt; obj.size(),它显示了我增加的价值。但 pt-&gt; size()与以前相同。我希望它会在某个地方引起任何问题,并且它没用,因为它与 KNIGHT 添加() size()无关

    所以结论就是这样。

    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;
    }
    

2 个答案:

答案 0 :(得分:2)

OBJ中的objKNIGHT隐藏UNIT中的class KNIGHT : public UNIT { public : // struct OBJ // { // float x,y,z; // }; // vector<OBJ> obj; 。将它们评论出来并再试一次:

{{1}}

答案 1 :(得分:1)

您有vector<OBJ> obj的两个不同实例。一个在基类中,一个在派生类中。由于KNIGHT公开来自UNIT,因此它可以访问UNIT的公开vector<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

作为观察,看起来你不需要将函数sizeUNIT变为纯虚拟(甚至虚拟),你可以在类{{1}中定义它们。 }。但是,如果您希望其他一些类在调用addsize时有不同的行为,那么您希望将它们保持为虚拟状态。

我不知何故错过了你实际提出问题的最后一行。问题是UNIT*只能访问UNIT类中的内容。它不知道它实际上指向KNIGHT对象。