Проблема, с которой вы столкнулись, является областью действия.
В C ++ существует две разные стратегии выделения:
- автоматическое хранение: объект, объявленный в блоке (
{ }
), его время жизни заканчивается блоком - динамического хранения: объект, выделенный с
new
(или new[]
, если это массив)
Если вы хотите создать переменнуюи доступ к нему за пределами его собственной области, то вам нужно полагаться на динамическое хранилище.Тем не менее, это не бесплатно, потому что тогда вы подвергаете себя проблемам управления временем жизни, поскольку теперь это руководство.
Поэтому рекомендуется использовать идиому RAII, чтобы связать время жизни динамически размещенного объекта с временем жизни динамического объекта.автоматически распределяется один.В вашем случае используйте умные указатели (или контейнеры).
Используя C ++ 11:
int main() {
std::vector< std::unique_ptr<A> > aa;
foo(aa);
std::cout << aa.front()->getVar(0,0) << "\n";
}
И соответственно обновите foo
:
void foo(std::vector< std::unique_ptr<A> >& aa) {
std::vector<std::vector<int> > var(1, std::vector<int>(1));
var[0][0] = 42;
aa.push_back(new B(var));
}