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

Accessing values stored in object c++

本文关键字:c++ 对象 存储 访问      更新时间:2023-10-16

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

问题是,一旦我创建了每个对象,我就无法获得它的值,

需要明确的是,我只希望我创建的每个floors实例在调用时返回值int。当我的虚拟函数build(int a)返回int

当前输出为

We are adding a spot to value 0 in our array

我还需要将该值添加到此output

因此,根据我当前的示例,它应该显示值5

我认为这应该是因为myBuilding.add(new floors(5));

复合体.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;
    }

楼层.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;
    }
};

这是处理数组的类,建筑.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';
        }
    }
};

在这个时候,我的C++变得生疏了,因为我在它中专业编程已经快两年了。我会像其他人一样回答,但可能会给出一个更好/更正确的答案。

  1. 你看到的输出是因为这一行:

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

    这一行的意思是打印i的值,而不是在调用build时楼层对象中包含的值。

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

  3. 由于我有点生疏,而且我还没有尝试过它,我无法告诉你floors类中build方法的签名实际上是什么,但我可以向你保证,它不是你想象的那样。我很困惑你到底想要它是什么。你真的想让它取一个不同的floor对象吗。它的使用方式我希望这是你正在寻找的签名。

    int build() {
        std::cout << "This is the floors class" << quantity << 'n';
        return quantity;
    }
    

为了获得我认为您正在寻找的输出,您需要更改building类中的build方法,使其看起来像这样(注意,您还必须更改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';
    }
}