继承:错误:聚合类型A具有不完整的类型,无法定义

时间:2012-06-15 09:25:15

标签: c++ inheritance

我正在尝试在基类方法中创建派生类对象。

我收到上述错误。以下是代码段。

任何帮助?

 ---- Voip_connection.hh ---- 

   #ifndef __VOIP_CONNECTION_HH
   #define __VOIP_CONNECTION_HH

 class VoipConnection {
 public:

VoipConnection();
VoipConnection (ConnectionState* cs);

void update_last_data_rcvd_time() { last_data_rcvd_time_ = msec_time(); }
uint64_t last_data_rcvd_time() { return last_data_rcvd_time_; }
void set_voip_proto(int proto) { voip_proto_ = proto;}

~VoipConnection()
{
    --nx_stat().act_connections;
    voip_idle_wait_timer_clear();
    sv_streaming_offset_ = 0;
    cl_streaming_offset_ = 0;
}


// Lots and Lots of Other stuff



  }


----Voip_sip.hh -----

#ifndef __VOIP_SIP_HH
#define __VOIP_SIP_HH
#include "voip_connection.hh"

class SipObj: public VoipConnection 
{

    /* stuff */
} 


--- Voip_connection.cc ----
#include "voip_connection.hh"

class SipObj; // Tried this in .hh file as well. 

VoipConnection::voip_process_pdu(bool from_client) 
{
 SipObj sip;
 sip.process(datap, &pdu_len);
 }

3 个答案:

答案 0 :(得分:1)

为了实例化一个类,您需要完整的类型。这个

SipObj sip;

需要SipObj的完整定义。一个简单的前向声明不会,你需要包含适当的标题。

一般来说,我会说有一个基类明确依赖于它的一个派生类型是一个非常糟糕的主意。

关于您报告的其他错误,它只是说类VoipConnection没有默认构造函数。所以你必须提供一个。

答案 1 :(得分:1)

第二个错误指​​出类VoipConnection没有默认构造函数,SipObj的构造函数试图调用它。

SipObjVoip_connection.cc的前瞻声明看起来很奇怪。为什么基类的实现需要知道派生类的存在?

答案 2 :(得分:0)

好的,我做了。我需要基类来实例化派生类.. 我在voip_sip.hh中做了前向声明,并在voip_connection.hh中包含了voip_sip.hh文件

---- Voip_connection.hh ---- 

 #ifndef __VOIP_CONNECTION_HH
 #define __VOIP_CONNECTION_HH
 #include voip_sip.hh

class VoipConnection {

// Lots and Lots of Other stuff

}

----Voip_sip.hh -----

#ifndef __VOIP_SIP_HH
#define __VOIP_SIP_HH
class VoipConnection;

class SipObj: public VoipConnection 
{

/* stuff */
} 


--- Voip_connection.cc ----
#include "voip_connection.hh"
#include "voip_sip.hh"


VoipConnection::voip_process_pdu(bool from_client) 
{
 SipObj sip;
 sip.process(datap, &pdu_len);
 }