2010-07-09 4 views
0

У меня проблема переднего замедления. Раньше у меня был обычный класс, называемый 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; 
    }; 
+0

Пожалуйста, переформатируйте –

+0

@somaya: подсказка: если вы вставляете свой код с 4 пробелами, вы получаете блок кода. Это будет гораздо легче прочитать. – Default

+0

Somaya, чтобы сделать код более удобным для чтения, выделите его и нажмите маленькую кнопку с 101010 в ней. Спасибо. –

ответ

2

Конструктор GlobalCWND принимает Ptr<ProtocolContext> по значению, которое в деструкторе вызывает метод на ProtocolContext указателя.
В соответствии с этой ошибкой, однако, ProtocolContext является неполным в этой точке - вам необходимо включить объявление для ProtocolContext.
Список того, что вы можете и чего не можете сделать с неполными типами, см. this answer.

+0

У меня есть 'class ProtocolContext; ' включен в'GlobalCWND', который ни на что не рассчитывает? – somaya

+0

@som: Это декларация с прямым декларированием и пересылкой только дает вам неполные типы. Вы можете делать только ограниченное количество вещей с неполными типами, а методы вызова не являются одним из них - см., Например, [этот ответ] (http://stackoverflow.com/questions/553682/when-to-use-forward-declaration/553869#553869). –

+0

Спасибо, Георг. Просто пытаясь понять лучше, я не понимаю, что код работает правильно, когда GlobalCWND использует обычные функции, а не виртуальные. Что вызывает ошибку только в том случае, когда у меня есть чистые виртуальные функции. (Я уверен, что во всех местах в файлах заголовков я использую Ptr , который в основном равен использованию * ProtocolContext) – somaya

Смежные вопросы