【问题标题】:Access violation in factory method工厂方法中的访问冲突
【发布时间】:2017-08-25 12:30:39
【问题描述】:

[EDIT] 错误出现在其他地方,@lite 帮我找到了,不需要更多答案

我的工厂类中有一个名为MakeDevice 的工厂方法,它返回一个指向基类对象的指针(但实际上指向其中一个子类的对象,具体取决于条件)。

执行程序时,我收到 xC0000005:访问冲突错误。 Visual Studio 调试器停止的行如下:

ret = new DeviceA;

代码: 基类是BaseDevice,两个子类是DeviceA和DeviceB。 DeviceModel 是一个枚举类型,使它更容易。

BaseDevice *DeviceFactory::MakeDevice(DeviceModel model) {
    BaseClass *ret;
    switch(model) {
        case model_deviceA:
            ret = new DeviceA;    // debugger stops here
            break;
        case model_deviceB:
            ret = new DeviceB;
            break;
        default:
            printf("error");
            break;
        }
    return ret;
}

有没有人经历过类似的事情?我读过这是实现这种工厂的正确方法。我也对设计更改持开放态度,只要我能以同样的方式抽象地使用基类上的方法。

【问题讨论】:

  • DeviceA 构造函数里面有什么?
  • 请尝试创建Minimal, Complete, and Verifiable Example 并展示给我们。
  • 如果有错误,你的函数会返回一个未初始化的指针。
  • 目前我从来没有遇到过默认情况,所以我只是在我的问题中写了一个打印。感谢@litelite,我注意到 DeviceA 的构造函数包含对 DLL 函数的函数指针调用,我会检查是否是它
  • 所以毕竟这是一个 LoadLibrary 调用,由于某种原因没有返回 dll 句柄我会调查,再次感谢您的参与

标签: c++ visual-studio oop pointers factory


【解决方案1】:

您还应该使用 nullptr 初始化 ret。

【讨论】:

    猜你喜欢
    • 2014-10-16
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多