Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调试器:如何获取构造函数中类名的地址_C++_Visual Studio_Debugging_Immediate Window - Fatal编程技术网

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”将显示: 无法计算表达式的值

在断点处,我的问题是:

  • 如何通过使用获取即时窗口中class1的地址 标识符“class1”?(是的,我知道它的地址和 “这个”)
  • 同样的问题:内存窗口
  • 为什么即时窗口中的“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