Отладчик VS2008 C ++ кажется неспособным / не желающим просматривать экземпляры структур, определенных внутри функции. Как люди отлаживают такой код?

Отладчик VS2008 C ++ кажется неспособным / не желающим просматривать экземпляры структур, определенных внутри функции, когда эти экземпляры (или ссылки на них) объявляются в области, отличной от той, в которой определена вложенная структура (например, цикл for). Есть идеи, почему это так?

void MyClass::doSomething()
{
struct NestedStruct
{
int usefulMetaInfo
vector<double> data;
};

//WORKS - Debugger can see inside ns
NestedStruct ns;
ns.data.push_back(1);

//FAILS - Debugger cannot see inside ns
for{int i=0;i<1;i++}
{
NestedStruct ns;
ns.data.push_back(1);
}

}

-1

Решение

Такие структуры имеют внутреннюю связь, и почти наверняка у отладчика возникнут проблемы с его просмотром по той же причине, по которой запрещено использовать их в качестве параметров типа шаблона.

Ваше единственное решение здесь может заключаться в том, чтобы поместить структуру, например, в детальное пространство имен, чтобы дать ей внешнюю связь.

0

Другие решения

Обойти эту проблему достаточно просто.

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

void MyClass::doSomething()
{
struct NestedStruct
{
int usefulMetaInfo
vector<double> data;
};

NestedStruct ns*; //declare here
for{int i=0;i<1;i++}
{
//NestedStruct ns*; //DON'T declare here
ns = someContainer[i];
ns->data.push_back(1);
}

}

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

Почему отладчик имеет эту проблему, я не знаю …

0

По вопросам рекламы [email protected]