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

Inheritance : error: aggregate typeA has incomplete type and cannot be defined

本文关键字:类型 定义 错误 继承      更新时间:2023-10-16

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

我收到上述错误。下面是一个代码片段。

有什么帮助吗?

 ---- 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);
 }

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

SipObj sip;

需要SipObj的完整定义。简单的前向声明是行不通的,您需要包含适当的标头。

一般来说,我会说让基类显式依赖于它的派生类型之一是一个非常糟糕的主意。

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

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

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

好吧,

这就是我所做的。我需要基类来实例化派生类。我在 voip_sip.hh 中进行了前向声明,并将 voip_sip.hh 文件包含在 voip_connection.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);
 }