gpt4 book ai didi

c++ 纯虚类的前向声明

转载 作者:行者123 更新时间:2023-11-28 03:56:52 27 4
gpt4 key购买 nike

我有一个向前减速的问题。我之前有一个普通的类,叫做GlobalCWND,它被实例化并在另一个类ProtocolContext中使用。

我在 Requestor.h 中转发声明 ProtocolContext 类。

你可以看到这2个类的相关部分代码。

============协议(protocol)上下文========

 class Requestor<RequestorStrategy>;
class Receiver<ReceiverStrategy>;

class ProtocolContext : public Object
{
public:
ProtocolContext(Ptr<SubscriptionContext> , Ptr<ReceiverStrategy> , Ptr<
RequestorStrategy> );
.......

ProtocolContext::ProtocolContext(Ptr<SubscriptionContext> sctx, Ptr<
ReceiverStrategy> rec, Ptr<RequestorStrategy> req) :
receiver(rec), requestor(req)
{
m_sctx = sctx;
Ptr<GlobalCWND> m_globalCWND = Create<GlobalCWND> (this);
cout << "Initializing Protocol Context for rid"
<< m_sctx->GetMetaDataStrategy()->GetRid() << endl;
m_ph = Create<PacketHandler> (sctx);
}

=================Requestor.h=========

 class ProtocolContext;

class RequestorStrategy : public Object
{

public:
RequestorStrategy()
{
}
;
~RequestorStrategy()
{
}
;
/* Transitions */
virtual void
Trans(Ptr<ProtocolContext> , Ptr<Packet> ) = 0;
};

.....

它之前工作正常。现在我已将 GlobalCWND 更改为虚拟类,并且在协议(protocol)上下文构造函数中我有以下代码:

ProtocolContext::ProtocolContext(Ptr<SubscriptionContext> sctx, Ptr<
ReceiverStrategy> rec, Ptr<RequestorStrategy> req) :
receiver(rec), requestor(req)
{
m_sctx = sctx;
Ptr<GlobalCWND> m_globalCWND = Create<GlobalCWNDSimple> (this);

..............
}

但是现在我得到这个错误:

 GlobalCWND.h:21:   instantiated from here
ptr.h:441: error: invalid use of incomplete type ‘struct
ProtocolContext’
Requestor.h:16: error: forward declaration
of ‘struct ProtocolContext’

错误行是:

line 21 of GlobalCWND() is    GlobalCWND (){};
and line 16 of Requestor.h is class ProtocolContext;

ptr 类实际上是创建指向对象的指针,ptr.h 的第 441 行是该函数的最后一行:

template <typename T>
Ptr<T>::~Ptr ()
{
if (m_ptr != 0)
{
m_ptr->Unref();
}
}

GlobalCWND 的代码是这样开始的:

 class ProtocolContext;

class GlobalCWND : public Object
{
public:
GlobalCWND (){};
GlobalCWND (Ptr<ProtocolContext>){};
~GlobalCWND (){};

static TypeId GetTypeId(){
static TypeId tid = TypeId("GlobalCWND")
.SetParent<Object> ()
;
return tid;
};

最佳答案

GlobalCWND 的构造函数需要 Ptr<ProtocolContext>按值,在其析构函数中调用 ProtocolContext 上的方法指针。
然而,根据错误,ProtocolContext此时不完整 - 您需要包含 ProtocolContext 的声明.
有关使用不完整类型可以做什么和不能做什么的列表,请参阅 this answer .

关于c++ 纯虚类的前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3212030/

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