상속에서 발생하는 생성자 정의 시 오류 질문이요.
글쓴이: balgarac1 / 작성시간: 목, 2015/11/26 - 6:02오후
#include "Common.h"
class CPacketHeader
{
public:
CPacketHeader();
virtual ~CPacketHeader();
virtual void CShowPacket() {};
virtual void CPacketConversion(char *) {};
virtual void CSendPacket(int ) {};
};
class CLoginAuthReqPacket : public CPacketHeader
{
public:
CLoginAuthReqPacket();
~CLoginAuthReqPacket();
virtual void CShowPacket();
virtual void CPacketConversion(char *);
virtual void CSendPacket(int );
private:
dgt_auth_req_msg m_auth_req_msg;
};
class CLoginAuthResPacket : public CPacketHeader
{
public:
CLoginAuthResPacket();
~CLoginAuthResPacket();
virtual void CShowPacket();
virtual void CPacketConversion(char *);
virtual void CSendPacket(int );
private:
dgt_auth_res_msg m_auth_res_msg;
};
class CSqlReqPacket : public CPacketHeader
{
public:
CSqlReqPacket();
~CSqlReqPacket();
virtual void CShowPacket();
virtual void CPacketConversion(char *);
virtual void CSendPacket(int );
private:
dgt_sql_req_msg m_sql_req_msg;
};
class CSqlResPacket : public CPacketHeader
{
public:
CSqlResPacket();
~CSqlResPacket();
virtual void CShowPacket();
virtual void CPacketConversion(char *);
virtual void CSendPacket(int );
private:
dgt_sql_res_msg m_sql_res_msg;
};
class CCloseReqPacket : public CPacketHeader
{
public:
CCloseReqPacket();
~CCloseReqPacket();
virtual void CShowPacket();
virtual void CPacketConversion(char *);
virtual void CSendPacket(int );
private:
dgt_close_req_msg m_close_req_msg;
};
class CCloseResPacket : public CPacketHeader
{
public:
CCloseResPacket();
~CCloseResPacket();
virtual void CShowPacket();
virtual void CPacketConversion(char *);
virtual void CSendPacket(int );
private:
dgt_close_res_msg m_close_res_msg;
};이렇게 상속 받고 선언했습니다. cpp 파일에서는
CPacketHeader::CPacketHeader()
{
}
CPacketHeader::~CPacketHeader()
{
}
// 생성자
CLoginAuthReqPacket::CLoginAuthReqPacket()
{
bzero(&m_auth_req_msg, 0);
}
// 소멸자
CLoginAuthReqPacket::~CLoginAuthReqPacket()
{
}
// 생성자
CLoginAuthResPacket::CLoginAuthResPacket()
{
bzero(&m_auth_res_msg, 0);
}
// 소멸자
CLoginAuthResPacket::~CLoginAuthResPacket()
{
}
// 생성자
CSqlReqPacket::CSqlReqPacket()
{
bzero(&m_sql_req_msg, 0);
}
// 소멸자
CSqlResPacket::~CSqlResPacket()
{
}
// 생성자
CCloseReqPacket::CCloseReqPacket()
{
bzero(&m_close_req_msg, 0);
}
// 소멸자
CCloseResPacket::~CCloseResPacket()
{
}
// 로그인 요청 패킷 보여주기
void CLoginAuthReqPacket::CShowPacket()
{
cout << "[LOGIN AUTH REQ PACKET]" << endl;
cout << "[MSG TYPE] : " << m_auth_req_msg.msg_type << endl;
cout << "[DB USER] : " << m_auth_req_msg.db_user << endl;
cout << "[PASSWORD] : " << m_auth_req_msg.password << endl;
cout << "[PROGRAM NAME] : " << m_auth_req_msg.program_name << endl;
cout << "[DB NAME] : " << m_auth_req_msg.db_name << endl;
}
// 로그인 응답 패킷 보여주기
void CLoginAuthResPacket::CShowPacket()
{
cout << "[LOGIN AUTH RES PACKET]" << endl;
cout << "[MSG TYPE] : " << m_auth_res_msg.msg_type << endl;
cout << "[LOGIN RES MSG]" << endl;
cout << m_auth_res_msg.rtn_msg << endl;
};
// sql 요청 패킷 보여주기
void CSqlReqPacket::CShowPacket()
{
cout << "[SQL REQ PACKET]" << endl;
cout << "[MSG TYPE] : " << m_sql_req_msg.msg_type << endl;
cout << "[SQL TYPE] : " << m_sql_req_msg.sql_type << endl;
cout << "[SQL TEXT] : " << m_sql_req_msg.sql_text << endl;
};
// sql 응답 패킷 보여주기
void CSqlResPacket::CShowPacket()
{
cout << "[SQL RES PACKET]" << endl;
cout << "[MSG TYPE] : " << m_sql_res_msg.msg_type << endl;
cout << "[SQL TYPE] : " << m_sql_res_msg.sql_type << endl;
cout << "[SQL RES MSG] "<< endl;
cout << m_sql_res_msg.rtn_data << endl;
};
// 종료 요청 패킷 보여주기
void CCloseReqPacket::CShowPacket()
{
cout << "[CLOSE REQ PACKET]" << endl;
cout << "[MSG TYPE] : " << m_close_req_msg.msg_type << endl;
};
// 종료 응답 패킷 보여주기
void CCloseResPacket::CShowPacket()
{
cout << "[CLOSE RES PACKET]" << endl;
cout << "[MSG TYPE] : " << m_close_res_msg.msg_type << endl;
cout << "[CLOSE RES MSG] " << endl;
cout << m_close_res_msg.rtn_msg << endl;
}
// 로그인 요청 패킷 변환
void CLoginAuthReqPacket::CPacketConversion(char * a_chpBuf)
{
memcpy(&m_auth_req_msg, a_chpBuf, sizeof(dgt_auth_req_msg));
}
// 로그인 응답 패킷 변환
void CLoginAuthResPacket::CPacketConversion(char * a_chpBuf)
{
memcpy(&m_auth_res_msg, a_chpBuf, sizeof(dgt_auth_res_msg));
}
// sql 요청 패킷 변환
void CSqlReqPacket::CPacketConversion(char * a_chpBuf)
{
memcpy(&m_sql_req_msg, a_chpBuf, sizeof(dgt_sql_req_msg));
}
// sql 응답 패킷 변환
void CSqlResPacket::CPacketConversion(char * a_chpBuf)
{
memcpy(&m_sql_res_msg, a_chpBuf, sizeof(dgt_sql_res_msg));
}
// 종료 요청 패킷 변환
void CCloseReqPacket::CPacketConversion(char * a_chpBuf)
{
memcpy(&m_close_req_msg, a_chpBuf, sizeof(dgt_close_req_msg));
}
// 종료 응답 패킷 변환
void CCloseResPacket::CPacketConversion(char * a_chpBuf)
{
memcpy(&m_close_res_msg, a_chpBuf, sizeof(dgt_close_res_msg));
}
// 로그인 요청 패킷 전송
void CLoginAuthReqPacket::CSendPacket(int a_sock)
{
send(a_sock, &m_auth_req_msg, sizeof(dgt_auth_req_msg), 0);
}
// 로그인 응답 패킷 전송
void CLoginAuthResPacket::CSendPacket(int a_sock)
{
send(a_sock, &m_auth_res_msg, sizeof(dgt_auth_res_msg), 0);
}
// sql 요청 패킷 전송
void CSqlReqPacket::CSendPacket(int a_sock)
{
send(a_sock, &m_sql_req_msg, sizeof(dgt_sql_req_msg), 0);
}
// sql 응답 패킷 전송
void CSqlResPacket::CSendPacket(int a_sock)
{
send(a_sock, &m_sql_res_msg, sizeof(dgt_sql_res_msg), 0);
}
// 종료 요청 패킷 전송
void CCloseReqPacket::CSendPacket(int a_sock)
{
send(a_sock, &m_close_req_msg, sizeof(dgt_close_req_msg), 0);
}
// 종료 응답 패킷 전송
void CCloseResPacket::CSendPacket(int a_sock)
{
send(a_sock, &m_close_res_msg, sizeof(dgt_close_res_msg), 0);
}이렇게 만들었는데 에러가 나는 부분은
// 생성자
CSqlReqPacket::CSqlReqPacket()
{
bzero(&m_sql_req_msg, 0);
}
// 생성자
CCloseReqPacket::CCloseReqPacket()
{
bzero(&m_close_req_msg, 0);
}이 두군데에서만 빨간 줄이 뜹니다.
에러 메세지는 undefined reference to 'CCloseResPacket::CCloseResPacket()
undefined reference to 'CSqlResPacket::CSqlResPacket()'
이렇게 나옵니다.
에러 내용이 가상 함수가 자식 클래스에서 선언되지 않으면 발생할 수 있다그래서 빠졌나 찾아보니
잘 정의돼있고 스펠링 틀린 것도 없는 것 같은데 왜 에러가 나는지 모르겠습니다..
조언해주시면 감사하겠슶니다..감사합니다..
Forums:


gilgil.net
말 그대로 해당 함수를 implementation하지 않아서 발생하는 에러입니다.
www.gilgil.net
아....
제 눈엔 왜 다 제대로 된것처럼 보이나요..
음.
해결했습니다.!!
댓글 달기