Переменная захвата замыкания C

#c #closures

Вопрос:

В функции Cow (). Я пытаюсь зафиксировать переменный вес до закрытия. Но это работает неправильно. Переменный вес не фиксируется на закрытии. Когда я пытался запустить функцию getWeight (). Он вернул неинициализированное значение. Также функция setWeight() не работает.

 #include <iostream>

struct Mammal {
  std::function<void()> speak;
  std::function<int()> getWeight;
  std::function<void(int)> setWeight;
};

Mammal *Cow() {
    int weight = 100;

    auto *m = new Mammal();
    m->speak = []() { puts("momo~~ momo~~"); };
    m->getWeight = [amp;]() { return weight; };;
    m->setWeight = [amp;](int w) { weight = w; };

    return m;
}

int main() {
    Mammal *c = Cow();
    std::cout << "Cow Weight: " << c->getWeight() << 'n';

    c->setWeight(200);
    std::cout << "Cow New Weight: " << c->getWeight() << 'n';
}
 

Комментарии:

1. Где ты хочешь, чтобы жил этот вес?

2. Согласно вашему описанию, weight должна быть переменная-член класса вместо локальной переменной. И Mammal *Cow() , похоже, не лучший способ создать Mammal . Класса должно быть достаточно для этого случая без каких-либо std::function

3. @крис Я хочу, чтобы время жизни было запечатлено в объекте млекопитающих.

4. @LouisGo Да. Я не буду делать этого в реальном инженерном проекте. Я демонстрирую это, просто хочу знать, как работать с полиморфизмом ООП.

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