Лямбда возвращает пустую строку - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть класс Fee.

class Fee
{
private:
    std::string _code;
    int _value;
    std::string _description_EN;
    std::string _description_UA;
    std::vector<std::function<std::string()>> get_description;
public:
    //CONSTRUCTORS
    Fee(int value, std::string_view code, std::string_view description_EN, std::string_view description_UA);
    Fee(const std::string _csv_line, const char separator);
    Fee(const Fee &) = delete;
    Fee(Fee &&) = default;
    //OPERATORS
    Fee &operator=(const Fee &) = delete;
    Fee &operator=(Fee &&) = default;
    Fee &operator++() = delete;
    Fee &operator++(int) = delete;
    Fee &operator--() = delete;
    Fee &operator--(int) = delete;
    Fee &operator+(const Fee &other) = delete;
    Fee &operator-(const Fee &other) = delete;
    Fee &operator+=(const Fee &other) = delete;
    Fee &operator-=(const Fee &other) = delete;
    Fee &operator/(const Fee &other) = delete;
    Fee &operator*(const Fee &other) = delete;
    Fee &operator/=(const Fee &other) = delete;
    Fee &operator*=(const Fee &other) = delete;
    Fee &operator%(const Fee &other) = delete;
    Fee &operator%=(const Fee &other) = delete;
    //SETTERS
    void set_new_value(int value);
    //GETTERS
    std::string code();
    int value();
    std::string description(Language language = Language::EN);
    //FUNCTIONS

    //DESTRUCTOR
    ~Fee() = default;
};

И класс FeeList, в котором хранится карта сборов

class FeeList
{
private:
    std::map<std::string, Fee> _fee_list;
    FeeList() = default;
public:
    static FeeList &fee_list();
    //CONSTRUCTORS
    FeeList(const FeeList &) = delete;
    FeeList(FeeList &&) = delete;
    //OPERATORS
    FeeList &operator=(const FeeList &) = delete;
    FeeList &operator=(FeeList &&) = delete;
    //SETTERS

    //GETTERS
    Fee &fee(const std::string &code);
    //FUNCTIONS
    void addFee(Fee &fee);
    void from_csv_file(const std::string &inv_file, const std::string &um_file, const std::string &id_file, const std::string &tr_file, const char separator);
    //DESTRUCTOR
    ~FeeList() = default;

};

Конструктор класса Fee имеет следующие строки кода, которые заполняют"get_description" vector by lambdas

get_description.resize(2);
    get_description[static_cast<size_t>(fee::Language::EN)] = [this]()->std::string{return _description_EN;};
    get_description[static_cast<size_t>(fee::Language::UA)] = [this]()->std::string{return _description_UA;};

Эти лямбды вызываются функцией "description (fee :: Language: :)", которая должна возвращать описание неподобающим языком.Реализация довольно проста

std::string fee::Fee::description(Language language)
{
    return get_description[static_cast<size_t>(language)]();
}

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

РЕДАКТИРОВАТЬ: Вот ссылка на coliru.stacked-crooked.com с моим кодом вставлен и работает с указанной проблемой (значение int; и строковый код; это Ok описание строки; пусто) http://coliru.stacked -crooked.com / a / bc56eb53400bd1af Этот файл также можно найти с помощью командной строки Coliru: cat / Archive2 / bc /56eb53400bd1af / main.cpp

1 Ответ

0 голосов
/ 28 сентября 2019

Неявно-созданный Fee конструктор перемещения копирует лямбды в get_description - но он не достигает внутри этих лямбд и обновляет захваченный ими указатель.Они по-прежнему указывают на исходный объект Fee, который был перемещен из.Затем ваша программа демонстрирует неопределенное поведение при доступе к перемещенным объектам.

Вместо того, чтобы иметь две отдельные строковые переменные и вектор лямбда-выражений, почему бы вам просто не иметь вектор строк?

...