嗨,我是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>
从这个实验中,我提取了以下结果。
另外,我试过 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;
}
答案 0 :(得分:2)
OBJ
中的obj
和KNIGHT
隐藏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
作为观察,看起来你不需要将函数size
和UNIT
变为纯虚拟(甚至虚拟),你可以在类{{1}中定义它们。 }。但是,如果您希望其他一些类在调用add
或size
时有不同的行为,那么您希望将它们保持为虚拟状态。
我不知何故错过了你实际提出问题的最后一行。问题是UNIT*
只能访问UNIT
类中的内容。它不知道它实际上指向KNIGHT
对象。