访问存储在对象c ++中的值

时间:2014-10-04 02:58:23

标签: c++ arrays

我正在创建一个新对象,然后将虚函数的每个实例存储到一个数组中。

问题在于我创建它后无法获得每个对象的值,

要清楚我只希望我创建的每个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';

        }
    }

};

1 个答案:

答案 0 :(得分:1)

目前,我的C ++已经变得生疏,因为我在专业编程已经差不多2年了。我将回答没有其他人的答案,但可能会有更好/更正确的答案。

  1. 由于这一行,你得到了你所看到的输出:

    std::cout << "We are adding a spot to value " << i << " in our array" <<  '\n';
    

    该行表示打印i的值,而不是打电话给build时楼层对象中包含的值。

  2. 您在该循环的第一次迭代中调用build(0)。这将调用返回类型为build的基类complex类中的void函数。由于floorscomplex的子节点,因此最匹配的方法build的方法签名是接受int并返回void的方法签名。因此,在您的示例中,您创建了一个floors对象,quantity为5,但是当您调用build方法时,实际上是在调用基类buildnum设置为值0.由于num类被标记为building,您将无法访问protected类。{/ p>

  3. 由于我有点生疏,我没有尝试过,我不能告诉你build类中floors类的签名究竟是什么,但是我可以向你保证,这不是你的想法。我很困惑你真正想要的是什么。你真的希望它采取不同的floor对象。它的使用方式我希望这是你正在寻找的签名。

    int build() {
        std::cout << "This is the floors class" << quantity << '\n';
        return quantity;
    }
    
  4. 为了获得我认为您正在寻找的输出,您需要更改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';
        }
    }