0

,我是 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

(如果我直接访问KNIGHT的变量,例如pt->obj[0].x,则会导致“第 932 行超出范围”)

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

  1. UNIT* pt没有指向KNIGHT的向量 obj。
  2. 但是UNIT* pt可以使用KNIGHTadd()size()
  3. 可能它与UNITKNIGHT之间的继承有关。

此外,我尝试了 pt->obj.push_back()(在这种情况下,样本是UNIT::OBJ)并打印pt->obj.size(),它向我展示了增加的价值。但是pt->size()和以前一样。我希望它会在某个地方引起任何类型的问题,而且它是无用的,因为它与KNIGHTadd()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;
}
4

2 回答 2

2

OBJin隐藏那些obj在. 将它们注释掉,然后重试:KNIGHTUNIT

class KNIGHT : public UNIT
{
public :
    // struct OBJ
    // {
    //     float x,y,z;
    // };
    // vector<OBJ> obj;
于 2013-09-08T15:04:40.527 回答
1

您有两个不同的vector<OBJ> obj. 一个在基类中,一个在派生类中。因为从它KNIGHT公开派生,UNIT它可以访问UNIT's public 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并且size是纯虚拟的(甚至是虚拟的),你可以在 class 中定义它们UNIT。但是,如果您希望其他类在调用时具有不同的行为,add或者size您想让它们保持虚拟。

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

于 2013-09-08T15:04:38.930 回答