【问题标题】:C++ : pointer in vector and class inheritanceC++:向量和类继承中的指针
【发布时间】:2013-09-08 14:56:40
【问题描述】:

,我是 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,会导致'line 932 out of range')

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

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

【问题讨论】:

  • 请注意,如果您确实打算隐藏继承的名称,则可以通过执行类似UNIT::obj 的操作来访问基类版本,以访问派生类中的基类版本。 (当然,用基本名称替换 UNIT

标签: c++ class pointers inheritance vector


【解决方案1】:

KNIGHT 中的OBJobj 隐藏UNIT 中的那些。将它们注释掉,然后重试:

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

【讨论】:

  • 感谢您的帮助。当然,超出范围不会发生。但是我想要各种类型的单元都有自己的值..(对于多态性)indivisual的OBJ结构没有办法吗?
【解决方案2】:

您有两个不同的 vector&lt;OBJ&gt; obj 实例。一个在基类中,一个在派生类中。因为KNIGHT 公开派生自UNIT,所以它可以访问UNIT 的公开vector&lt;OBJ&gt; 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;
        }
    };

作为观察,您似乎不需要函数 addsize 是纯虚拟(甚至是虚拟),您可以在类 UNIT 中定义它们。但是,如果您希望其他类在调用 addsize 时具有不同的行为,那么您希望保持它们是虚拟的。

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

【讨论】:

  • 感谢您的帮助。如果没有办法存在,我将不得不使用记录个人特征的方法来勉强..
猜你喜欢
  • 2016-04-30
  • 2017-12-28
  • 1970-01-01
  • 2017-07-30
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多