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
类,该类随后构造从公共接口派生的适当连接类,并传递用于构造的相关数据。听起来与我建议的类似。