#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
выходит за рамки, когда вызов функции заканчивается, и эта память повторно используется для других целей стека. Вам придется выбрать место, которое может пережить вызов функции, будь то бесплатное хранилище, объект закрытия или каждый объект класса (в этом случае сделайте его обычным членом данных).