Как суммировать std :: список различных наследуемых классов C ++? - PullRequest
0 голосов
/ 18 апреля 2019

Сначала спасибо :(. Так что я сейчас делаю домашнее задание, работаю с std :: list и наследую классы.

Я хочу получить сумму объектов в классе A / B / C в std :: list Lists;

Я пытаюсь for_each, но, возможно, я был неправ.

Мои занятия

class Pets
{
protected:
    std::string iName;
    float iPrice;
public:
    virtual float getPrice();
    Pets();
    virtual ~Pets();
};

class Cat : public Pets
{
    std::string iType;
public:
    virtual float getPrice();
    Cat();
    virtual ~Cat();
};
class Dog : public Pets
{
    float iWeight;
public:
    virtual float getPrice();
    Dog();
    virtual ~Dog();
};

Это мой Source.cpp

#include "Pets.h"
#include "Dog.h"
#include "Cat.h"
#include <list>
#include <algorithm>
#include <functional>

void main() {
    std::list<Pets*> List;
    float sum = 0;
    std::for_each(List.begin(), List.end(), sum = sum + std::mem_fun(&Pets::getPrice));
    system("pause");

}

1 Ответ

1 голос
/ 18 апреля 2019

Pets не имеет члена getTien. Вы хотели написать &Pets::getPrice?

Вы не можете просто поместить произвольное выражение в качестве третьего параметра std::for_each. Вам нужно предоставить либо функцию, либо объект с operator(), таким как лямбда-выражение . Более конкретный алгоритм для вашего использования: std::accumulate

#include "Pets.h"
#include "Dog.h"
#include "Cat.h"
#include <list>
#include <algorithm>

void main() {
    std::list<Pets*> List;
    auto addPrice = [](float acc, Pets * pet){ return acc + pet->getPrice(); };
    float sum = std::accumulate(List.begin(), List.end(), 0.0, addPrice);
    system("pause");   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...