Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 继承:错误:聚合类型A的类型不完整,无法定义_C++_Inheritance - Fatal编程技术网

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

C++ 继承:错误:聚合类型A的类型不完整,无法定义,c++,inheritance,C++,Inheritance,我试图在基类方法中创建一个派生类对象 我得到的错误如上所述。下面是一段代码片段 有什么帮助吗 ---- Voip_connection.hh ---- #ifndef __VOIP_CONNECTION_HH #define __VOIP_CONNECTION_HH class VoipConnection { public: VoipConnection(); VoipConnection (ConnectionState* cs); void update_las

我试图在基类方法中创建一个派生类对象

我得到的错误如上所述。下面是一段代码片段

有什么帮助吗

 ---- 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的完整定义。简单的转发声明不行,您需要包含适当的头

一般来说,让基类显式地依赖于它的一个派生类型是一个非常糟糕的想法


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

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


Voip\u connection.cc
中的
SipObj
转发声明看起来很奇怪。为什么基类的实现需要知道派生类的存在?

好的,我就是这么做的。我需要基类来实例化派生类。。 我在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);
 }

也许
VoipConnection
没有公共默认构造函数?您需要提供它的源代码。如果未在
SipObj
中定义任何构造函数,编译器将不知道如何初始化基础的
VoipConnection
。似乎VoipConnection有一个非默认构造函数,如果基类试图实例化派生类,则需要使用SipObj构造函数解决该构造函数,这可能是您的继承层次结构颠倒的迹象。这个问题不明确,标题中有一个错误,实际问题中有另一个错误。请选择一个更好的标题,并将两个错误都放在问题中。或者更好的办法是,用一个错误问一个问题,当问题解决后,你仍然有错误,然后再问另一个问题。你必须展示更多的
VoipConnection
类,尤其是你的构造函数。最好是显示整个类声明。您提到的内容将导致另一个错误,但这不是问题所涉及的错误。@JoachimPileborg问题标题上的错误是我在这里处理的错误。好的,我只检查了问题中的错误,不在标题中。关于在基类中使用派生类,这可能不常见,但它很常见,它有一个命名模式:VoipConnection对象是在连接设置期间创建的,并且基于数据包,VoipConnection决定它属于哪个对象,。。比如SipObj,XAZObj等等。。因此,它必须正确地创建其子对象并移交数据包,以便进行处理。好的,看起来您需要不同的体系结构。类似于
SetupConnection
类,该类随后构造从公共接口派生的适当连接类,并传递用于构造的相关数据。听起来与我建议的类似。