使用 - >从一组对象索引访问虚函数

时间:2011-06-28 16:52:49

标签: c++

我目前正在编写一个关于继承属性的c ++编码。

有一个基础类枪{} ,还有几个派生类:

手枪:公枪{}

左轮手枪:公共手枪{}

手枪:公共手枪{}

根据目前的分配,我在每个类中添加了一个虚拟函数 print(),它覆盖了上一个类的 print(),添加要打印的唯一变量。例如,枪有字符串制造商,手枪有字符串夹点,手枪有 bool semiauto

现在,我的教授要我制作一个包含2个(两个)对象的数组,一个类型为左轮手枪:公共手枪的对象和一个类型为手枪的对象:public handgun

在作业中,他说我们必须使用这个确切的代码来打印出数组的内容:

for(int i=0; i <= numGuns; i++)
       **gunCabinet[i]->print();**

现在,我的代码。有问题的错误是粗体,靠近底部。

int main() {
//declares the revolver and pistol objects
revolver Anaconda;
pistol M9;

//sets appropriate variables for the objects
Anaconda.setManufacturer("Smith & Wesson");
M9.setManufacturer("Beretta");
Anaconda.setCaliber(".44 special");
M9.setCaliber("9x19mm Parabellum");
Anaconda.setGrips("Hogue grips");
M9.setGrips("U.S. Military specification grips");
Anaconda.setSights("6x scope");
M9.setSights("U.S. Military specification iron sights");
Anaconda.setLaser(true);
M9.setLaser(false);
Anaconda.setSingleAction(true);
Anaconda.setNumberOfRounds(6);
M9.setSemiAuto(true);

 int numGuns = 2;

 gun* gunCabinet;
 gunCabinet = new gun[numGuns];
 gunCabinet[0] = Anaconda;
 gunCabinet[1] = M9;

 // *(gunCabinet) = Anaconda;
 //*(gunCabinet + 1) = M9;



//gun * gunCabinet[/*numGuns*/2] = {&Anaconda, &M9};




for(int i=0; i <= numGuns; i++)
   **gunCabinet[i]->print(); //ERROR ON THIS LINE**

//cout << Anaconda << endl;
//Anaconda.print();
//cout << M9 << endl;
//M9.print();


return 0;
}

我已经评论了我做这项工作的其他尝试。

现在,当我运行这个时,我得到一个错误,说“'&gt;'的基本操作数'具有非指针类型'gun'”。

除非我的教授犯了错误,否则我认为这就是我的全部。问题是,我无法弄清楚我做错了什么。我不一定要找我的作业答案,而是他的代码有效吗?如果它是有效的,我可以在我做错的事情上有一些指针(没有双关语)吗?非常感谢!

4 个答案:

答案 0 :(得分:2)

您将gunCabinet创建为gun个对象的数组,但您真正想要的是gun*gun指针数组。

gun* gunCabinet[2];
gunCabinet[0] = &Anaconda;
gunCabinet[1] = &M9;

答案 1 :(得分:1)

为了使用->,您需要从指针类型调用。当您使用数组访问时,您将取消引用一个指针,因此您的错误是非指针类型。

您需要做的是拥有gun **gunCabinet,并使用每个堆栈变量的地址初始化数组,然后您可以在数组访问中使用箭头运算符。

gun** gunCabinet;
gunCabinet = new gun*[numGuns];
gunCabinet[0] = &Anaconda;
gunCabinet[1] = &M9;

然后你可以使用

gunCabinet[0]->print();

稍后。

答案 2 :(得分:0)

- &gt; 运算符与指针一起使用,以访问方法和成员。指针需要获取对象的地址。

因此,因为你有一个实际对象数组,而不是一个指针数组,你需要获得对它们地址的引用。
您可以使用&amp; 运算符获取对象的地址(除非运算符过载)。

gun = &gunCabinet[1];
gun->A_Guns_method();

答案 3 :(得分:0)

只是一个想法,但是...教师给出的for循环中的行是**gunCabinet[i]->print();**(至少在你引用时)。在你的循环中,你写了**gunCabinet[i]->print();。我宁愿怀疑前面的**和表达式之后的那些都是强调的,并不意味着它们是实际代码的一部分。 (之后的那些不可能。)如果没有它们,只需制作一系列指针,就像Platinum Azure所暗示的那样,就足够了。并且,无论您使用何种表达式访问它们都是必需的,因为数组不能保存多态对象;如果你试图将派生类型的东西放入基数组中,它将被切片,你所得到的只是基础部分的副本。 (更一般地说,赋值不适用于多态,我通常建议通过派生boost::noncopyable来使基类不可操作。)