gpt4 book ai didi

c++ - 解决 C++ 中不明确的 this 指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:52 26 4
gpt4 key购买 nike

我正在尝试从旧类派生新类。基类声明如下所示:

class Driver : public Plugin, public CmdObject
{
protected:
Driver();

public:
static Driver* GetInstance();
virtual Engine& GetEngine();
public:
// Plugin methods...
virtual bool InitPlugin (Mgr* pMgr);
virtual bool Open();
virtual bool Close();

// CmdObject
virtual bool ExecObjCmd(uint16 cmdID, uint16 nbParams, CommandParam *pParams, CmdChannelError& error);

Mgr *m_pMgr;

protected:
Services *m_pServices;
Engine m_Engine;
};

它的构造函数如下所示:

Driver::Driver() : 
YCmdObject("Driver", (CmdObjectType)100, true),
m_Engine("MyEngine")
{
Services *m_pServices = NULL;
Mgr *m_pMgr = NULL;
}

所以当我创建派生类时,我首先尝试简单地从基类继承:

class NewDriver : public Driver

并复制构造函数:

NewDriver::NewDriver() : 
CmdObject("NewDriver", (EYCmdObjectType)100, true),
m_Engine("MyNewEngine")
{
Services *m_pServices = NULL;
Mgr *m_pMgr = NULL;
}

编译器(Analog Devices 的 VisualDSP++ 5.0)不喜欢这样:

".\NewDriver.cpp", line 10: cc0293:  error: indirect nonvirtual base
class is not allowed
CmdObject("NewDriver", (EYCmdObjectType)100, true),

有道理,所以我决定直接继承Plugin和CmdObject。为了避免多重继承歧义问题(我是这么想的),我使用了虚拟继承:

class NewDriver : public Driver, public virtual Plugin, public virtual CmdObject

但是,在 NewDriver 中的虚拟方法的实现中,我尝试调用采用 Plugin* 的 Mgr::RegisterPlugin 方法,我得到了这个:

".\NewDriver.cpp", line 89: cc0286:  error: base class "Plugin" is
ambiguous
if (!m_pMgr->RegisterPlugin(this))

this 指针是如何产生歧义的,我该如何解决?

谢谢,

--保罗

最佳答案

如果您从 Driver 派生,则不必显式调用 Driver 基类的构造函数:

class NewDriver : public Driver { /* ... */ };
NewDriver::NewDriver() : Driver() {}

Driver 的构造函数然后初始化它自己的基,你不必也不应该直接这样做。
如果它应该有不同的行为,让它接受参数:

class Driver : /* ... */ {
public:
Driver(const std::string& name /* , ... */)
: CmdObject(name /* , ... */)
{}
// ...
};

NewDriver::NewDriver() : Driver("NewDriver" /* , ... */) {}

关于c++ - 解决 C++ 中不明确的 this 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2807293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com