我正在创建一个新对象,然后将虚函数的每个实例存储到一个数组中。
问题在于我创建它后无法获得每个对象的值,
要清楚我只希望我创建的每个floors
实例在调用时返回值int。我的虚拟函数build(int a)
返回int
当前输出
We are adding a spot to value 0 in our array
我还需要将值添加到此output
所以基于我当前的例子,它应该显示值5
我认为这应该有效,因为myBuilding.add(new floors(5));
complex.h
class complex {
protected:
int num;
public:
virtual void build(int a) {
num = a;
}
};
的main.cpp
#include "floors.h"
int main() {
building myBuilding;
myBuilding.add(new floors(5));
myBuilding.build();
return 0;
}
floors.h
class floors : public complex {
private:
int quantity;
public:
floors(const int& init_quant) :
quantity(init_quant)
{
}
int build(floors()) {
std::cout << "This is the floors class" << quantity << '\n';
return quantity;
}
};
这是处理数组的类, building.h
class building {
public:
static const int max_materials = 100;
complex* materials[max_materials];
int num_materials;
public:
building() : num_materials(0) {}
~building() {
for(int i = 0; i < num_materials; ++i) { delete materials[i]; }
}
bool add(complex* s) {
if(num_materials >= max_materials) { return false; }
materials[num_materials++] = s;
return true;
}
void build() {
for(int i = 0; i < num_materials; ++i) { materials[i]->build(i);
std::cout << "We are adding a spot to value " << i << " in our array" << '\n';
}
}
};
答案 0 :(得分:1)
目前,我的C ++已经变得生疏,因为我在专业编程已经差不多2年了。我将回答没有其他人的答案,但可能会有更好/更正确的答案。
由于这一行,你得到了你所看到的输出:
std::cout << "We are adding a spot to value " << i << " in our array" << '\n';
该行表示打印i
的值,而不是打电话给build
时楼层对象中包含的值。
您在该循环的第一次迭代中调用build(0)
。这将调用返回类型为build
的基类complex
类中的void
函数。由于floors
是complex
的子节点,因此最匹配的方法build
的方法签名是接受int并返回void的方法签名。因此,在您的示例中,您创建了一个floors
对象,quantity
为5,但是当您调用build
方法时,实际上是在调用基类build
将num
设置为值0.由于num
类被标记为building
,您将无法访问protected
类。{/ p>
由于我有点生疏,我没有尝试过,我不能告诉你build
类中floors
类的签名究竟是什么,但是我可以向你保证,这不是你的想法。我很困惑你真正想要的是什么。你真的希望它采取不同的floor
对象。它的使用方式我希望这是你正在寻找的签名。
int build() {
std::cout << "This is the floors class" << quantity << '\n';
return quantity;
}
为了获得我认为您正在寻找的输出,您需要更改build
类中的building
方法,看起来像这样(注意,您还必须更改在floor类中构建方法以匹配我在第3点中列出的方法:
void build() {
for(int i = 0; i < num_materials; ++i) {
int quantity = materials[i]->build();
std::cout << "We are adding a spot to value " << quantity << " in our array" << '\n';
}
}