C++ 调试器:如何获取构造函数中类名的地址
注意:我不是想解决编程问题;我在努力学习C++ 调试器:如何获取构造函数中类名的地址,c++,visual-studio,debugging,immediate-window,C++,Visual Studio,Debugging,Immediate Window,注意:我不是想解决编程问题;我在努力学习 给出了C++代码: #include <iostream> class class1 { public: int attr1 = 12; class1() { } // breakpoint }; int main() { class1 c1; } 此外,在内存窗口中,在地址字段中输入“class1”将显示: 无法计算表达式的值 在断点处,我的问题是:
给出了C++代码:
#include <iostream>
class class1
{
public:
int attr1 = 12;
class1()
{
} // breakpoint
};
int main()
{
class1 c1;
}
此外,在内存窗口中,在地址
字段中输入“class1”将显示:
无法计算表达式的值
在断点处,我的问题是:
我猜您希望访问该类的RTTI。可能不同的编译器实现它的方式略有不同 也就是说,有一个名为
typeid
的操作符:
请查看此博客,以获取将其与Visual C编译器结合使用的示例:
此示例的特征是:
#include <iostream>
class MyClass {};
class MyDerivedClass : public MyClass {};
template<typename T> void PrintTypeInformation(char const* pVarName, T const& t)
{
std::cout
<< pVarName
<< ": type: " << typeid(t).name()
<< ", raw type: " << typeid(t).raw_name()
<< std::endl;
}
int main(void)
{
MyClass cls;
MyDerivedClass *drv;
int n;
char c;
__int64 l;
double d;
#define PRINT_TYPE_INFORMATION(var) PrintTypeInformation(#var, var)
PRINT_TYPE_INFORMATION(cls);
PRINT_TYPE_INFORMATION(drv);
PRINT_TYPE_INFORMATION(n);
PRINT_TYPE_INFORMATION(c);
PRINT_TYPE_INFORMATION(&l);
PRINT_TYPE_INFORMATION(d);
return 0;
}
如果您对访问PDB文件(MSVC)中的调试信息感兴趣,请查看此问题的答案:
类型没有地址。您可能正在查找
c1
的地址,它是class1
的一个实例。您应该使用对象c1
。请注意,您还使用了attr1
而不是int
。运行时不存在类名。它们没有大小或地址。@user4581301类确实有大小。(是的,我知道它与“this”的地址相同)不,那是错误的。类定义一个类型,然后您可以创建该类型的实例。您可以获取实例的addtress,但不能获取类型的addtress。想象如下:intx
您可以获取变量x
的地址,但不能获取类型int
的地址,谢谢@Den Jason。这些信息可能会给我一些线索,告诉我如何回答我的问题,但这是我无法理解的。。。再次感谢大家。我的问题似乎与实现/调试器高度相关,答案可能是“当在class1范围内时,VS debugger允许使用class1标识符访问对象的非静态成员,但缺少SRO时,调试器将class1标识符视为一种类型”
#include <iostream>
class MyClass {};
class MyDerivedClass : public MyClass {};
template<typename T> void PrintTypeInformation(char const* pVarName, T const& t)
{
std::cout
<< pVarName
<< ": type: " << typeid(t).name()
<< ", raw type: " << typeid(t).raw_name()
<< std::endl;
}
int main(void)
{
MyClass cls;
MyDerivedClass *drv;
int n;
char c;
__int64 l;
double d;
#define PRINT_TYPE_INFORMATION(var) PrintTypeInformation(#var, var)
PRINT_TYPE_INFORMATION(cls);
PRINT_TYPE_INFORMATION(drv);
PRINT_TYPE_INFORMATION(n);
PRINT_TYPE_INFORMATION(c);
PRINT_TYPE_INFORMATION(&l);
PRINT_TYPE_INFORMATION(d);
return 0;
}
cls: type: class MyClass, raw type: .?AVMyClass@@
drv: type: class MyDerivedClass *, raw type: .PAVMyDerivedClass@@
n: type: int, raw type: .H
c: type: char, raw type: .D
&l: type: __int64 *, raw type: .PA_J
d: type: double, raw type: .N