我目前正在编写一个关于继承属性的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'”。
除非我的教授犯了错误,否则我认为这就是我的全部。问题是,我无法弄清楚我做错了什么。我不一定要找我的作业答案,而是他的代码有效吗?如果它是有效的,我可以在我做错的事情上有一些指针(没有双关语)吗?非常感谢!
答案 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
来使基类不可操作。)