c++ - 在 Visual Studio 中调试 PIMPL(2012)

标签 c++ pimpl-idiom

我有一个包含以下类的 DLL:

目录.h:

#ifndef CAT_H
#define CAT_H

class __declspec( dllexport ) Cat
{
    class CatImpl;  // Not defined here
    CatImpl *cat_;  // Handle
public:
    Cat();
    int a;
}; 

#endif

猫.cpp:

#include "Cat.h"

class Cat::CatImpl
{
public:
    int c1;
    int c2;
};

Cat::Cat()
{
    cat_ = new Cat::CatImpl();
    cat_->c1 = 1; 
}

然后我有一个项目(在单独的解决方案中)创建此类的实例:

主要.cpp:

#include <Windows.h>
#include "..\..\DLL\DLL\Cat.h"

int CALLBACK WinMain(
  _In_  HINSTANCE hInstance,
  _In_  HINSTANCE hPrevInstance,
  _In_  LPSTR lpCmdLine,
  _In_  int nCmdShow
)
{
    Cat cat;
    int x = 0;
}

现在我在该行放置一个断点:

int x = 0;

然后打开快速监 window 口: image

符号已加载,*(cat.cat_) 不起作用:

image

有什么办法可以查看cat_的内容吗?

到目前为止我想出的唯一方法是:

(int)(*((char*)cat.cat_ + 0))

另外,为什么以下返回 0?:

image

最佳答案

解决此问题的方法是在值上添加一个监视,您可以在其中 "cast"它到包含 impl 的 DLL。所以在你的情况下就是这样。

(DLL.dll!Cat::CatImpl*)cat.cat_

关于c++ - 在 Visual Studio 中调试 PIMPL(2012),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22972317/

相关文章:

c++ - lldb 可以显示 typedef 的实际类型吗?

c++ - pimpl 习语和模板类 friend

c++ - 带有 pimpl 习语的模板化类不正确

c++ - C++ pimpl中使用void指针的优缺点

Pimpl 习语上下文中的 C++17 自定义迭代器

c++ - pArray = pArray + 1;有人可以向我解释这如何在 C++ 中增加数组吗?

c++ - 无法使用 cin.get() 读取两个字符串

c++ - WTL 拆分器示例中的调试断言

c++ - 在没有库函数的情况下获取进程 ID?

c++ - 实现 pimpl 习惯用法时出现链接器错误