2014-10-04 3 views
-1

Я создаю новый экземпляр моего объекта, а затем сохраняю каждый экземпляр виртуальной функции в массив.Доступ к значениям, хранящимся в объекте C++

Проблема заключается в том, что я не могу получить значение каждого объекта, как только я его создать,

Чтобы быть ясно, я просто хочу, каждый экземпляр 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

Просто боковое примечание к вашему коду. У вас будет утечка памяти каждый раз, когда вы пытаетесь добавить пол, и вы вышли за пределы «max_materials». Было бы лучше использовать 'std :: array' и хранить' std :: unique_ptr', чем вам не придется беспокоиться об очистке. – pstrjds

+0

Спасибо тон за вход bro. Я очень новичок в C++ и люблю его до смерти! Это назначение было намного проще, чем это. И есть намного больше, поэтому я показал, что я играю с ним сейчас, потому что это произошло, потому что я хочу узнать больше. Мне нравится учиться делать все возможное с каждым заданием, поэтому я действительно не свой материал. – wuno

ответ

1

На данный момент, мой C++ становится ржавым, поскольку прошло почти два года с тех пор, как я профессионально программировал в нем. Я собираюсь ответить, как никто другой, но, вероятно, есть лучший/более правильный ответ, который можно было бы дать.

  1. Вы получаете выход вы видите из этой линии:

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

    Эта линия говорит распечатать значения i, а не значение, которое содержится в объекте пол, когда вы звоните build.

  2. Вы вызываете build(0) в первую итерацию этого цикла. Это вызовет функцию build в классе базового класса complex, который имеет тип возврата void. Поскольку floors является дочерним элементом complex и сигнатурой метода для метода build, то наилучшим совпадением является тот, который принимает int и возвращает void. Итак, в вашем примере вы создали объект floors с quantity из 5, но затем, когда вы вызываете метод build, вы на самом деле вызываете базовый класс build, который устанавливает num в значение 0. Вы не сможете получить доступ к num значение от building класс за счёт его как protected.

  3. Как я немного ржавый, и я не экспериментировал с этим, я не могу вам сказать, что подпись метода build в floors классе на самом деле, но я могу гарантировать вам, что это не что вы думаете. Я смущен тем, что вы на самом деле хотите. Вы действительно хотите, чтобы он принял другой объект floor. То, как оно используется, я бы ожидал, что это подпись, которую вы ищете.

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

Для того, чтобы получить результат, который я думаю, что вы ищете вам нужно будет изменить метод build в building классе выглядеть примерно так (обратите внимание, вы также должны изменить сборки метод в классе пола в соответствии с методом, указанным в пункте 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'; 
    } 
} 
+0

Да, я пробовал это. По какой-то причине он не возвращает количество. – wuno

+0

@NDiaz Когда вы говорите, что попробовали, вы имеете в виду, что пытались сделать эту подпись. Это не решит вашу проблему. Если вы посмотрите на пункт 2 в моем списке, вы увидите, что функция, вызываемая в вызове 'building :: build', не является' build' в классе 'floor', а' build' в ' сложный' класс. Я обновил свой ответ, чтобы показать, как изменить метод сборки в классе здания. – pstrjds

+0

@NDiaz - Я добавил пару обновлений к моему ответу. Из вашего вопроса не совсем ясно, что вы сделали, поэтому я надеюсь, что я ответил соответствующим образом. – pstrjds

Смежные вопросы