У меня проблема переднего замедления. Раньше у меня был обычный класс, называемый GlobalCWND
, он был создан и использовался в другом классе ProtocolContext
.C++ форвардная декларация чистого виртуального класса
Переслать класс протокола ProtocolContext в Requestor.h
.
Вы можете увидеть связанную часть кода этого 2 класса.
============ Протокол Контекст ========
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
к виртуальному классу и В конструкторе протокола Context У меня есть этот код:
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 на самом деле создает указатель на объект, строка 441 из ptr.h является последней строкой этой функции:
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;
};
Пожалуйста, переформатируйте –
@somaya: подсказка: если вы вставляете свой код с 4 пробелами, вы получаете блок кода. Это будет гораздо легче прочитать. – Default
Somaya, чтобы сделать код более удобным для чтения, выделите его и нажмите маленькую кнопку с 101010 в ней. Спасибо. –