c++ 질문입니다.
글쓴이: balgarac1 / 작성시간: 목, 2015/11/26 - 2:03오후
class CPacketHeader
{
public:
UB2 msg_type;
CPacketHeader(UB2 msgType);
virtual ~CPacketHeader();
virtual void CShowPacket() = 0;
};
class CLoginAuthReqPacket : public CPacketHeader
{
public:
CLoginAuthReqPacket(UB2 msgType, SCHAR * dbUser, SCHAR * pw, SCHAR * dbName, SCHAR * pName);
~CLoginAuthReqPacket();
void CShowPacket();
private:
SCHAR db_user[33];
SCHAR password[33];
SCHAR program_name[33];
SCHAR db_name[33];
};
class CLoginAuthResPacket : public CPacketHeader
{
public:
CLoginAuthResPacket(UB2 msgType, UB2 rtnLen, SCHAR * rtnMsg);
~CLoginAuthResPacket();
void CShowPacket();
private:
UB2 rtn_len;
SCHAR rtn_msg[257];
};상속 구조를 갖고 있습니다.
CPacketHeader::CPacketHeader(UB2 msgType)
{
msg_type = msgType;
}
// 로그인 요청 생성자
CLoginAuthReqPacket::CLoginAuthReqPacket(UB2 msgType, SCHAR * dbUser, SCHAR * pw, SCHAR * dbName, SCHAR * pName) : CPacketHeader(msgType)
{
strcpy((char *)db_user, (char *)dbUser);
strcpy((char *)password, (char *)pw);
strcpy((char *)db_name, (char *)dbName);
strcpy((char *)program_name, (char *)pName);
}
// 로그인 응답 생성자
CLoginAuthResPacket::CLoginAuthResPacket(UB2 msgType, UB2 rtnLen, SCHAR * rtnMsg) : CPacketHeader(msgType)
{
rtn_len = rtnLen;
strcpy((char *)rtn_msg, (char *)rtnMsg);
}
void CLoginAuthReqPacket::CShowPacket()
{
cout << "[LOGIN AUTH REQ PACKET]" << endl;
cout << "[MSG TYPE] : " << msg_type << endl;
cout << "[DB USER] : " << db_user << endl;
cout << "[PASSWORD] : " << password << endl;
cout << "[PROGRAM NAME] : " << program_name << endl;
cout << "[DB NAME] : " << db_name << endl;
}
void CLoginAuthResPacket::CShowPacket()
{
cout << "[LOGIN AUTH RES PACKET]" << endl;
cout << "[MSG TYPE] : " << endl;
cout << "[LOGIN RES MSG]" << endl;
cout << rtn_msg << endl;
};이렇게 짰는데 각 생성자마다 빨간줄 그어지면서 선언한 가상함수를 구현하지 않았다고 그러는데..
전 구현헀는데 왜 에러가 발생하는건가요??
Forums:


상속받은 함수를 오버라이딩을 할때 명시적으로
상속받은 함수를 오버라이딩을 할때 명시적으로 virtual 혹은 최신 C++11에서는 override 예약어를 사용하세요
(override 예약어를 사용했을 시, 코딩상 실수로 함수 시그네춰를 안맞출 경우 컴파일 에러를 띄워줍니다.)
그리고 제 컴파일러로는 에러는 뱉지 않는군요(linux, g++).
(컴파일은 g++ -c -Wall -Wextra a.cpp 로 했네요. 경고 하나도 안떳습니다.)
혹시 VS 쓰시나요? 예전에 VS 쓸 때 빌드 잔버그 많던데
빌드 정리 하고 나서 빌드 새로 해보셨나요?
PS. typedef 등만 추가하고 컴파일 했습니다. 똑같지만..올려봅니다.
헤더
typedef unsigned short UB2; typedef char SCHAR; class CPacketHeader { public: UB2 msg_type; CPacketHeader(UB2 msgType); virtual ~CPacketHeader(); virtual void CShowPacket() = 0; }; class CLoginAuthReqPacket : public CPacketHeader { public: CLoginAuthReqPacket(UB2 msgType, SCHAR * dbUser, SCHAR * pw, SCHAR * dbName, SCHAR * pName); ~CLoginAuthReqPacket(); void CShowPacket(); private: SCHAR db_user[33]; SCHAR password[33]; SCHAR program_name[33]; SCHAR db_name[33]; }; class CLoginAuthResPacket : public CPacketHeader { public: CLoginAuthResPacket(UB2 msgType, UB2 rtnLen, SCHAR * rtnMsg); ~CLoginAuthResPacket(); void CShowPacket(); private: UB2 rtn_len; SCHAR rtn_msg[257]; };구현
#include "a.hpp" #include <cstring> #include <iostream> using std::cout; using std::endl; CPacketHeader::CPacketHeader(UB2 msgType) { msg_type = msgType; } // 로그인 요청 생성자 CLoginAuthReqPacket::CLoginAuthReqPacket(UB2 msgType, SCHAR * dbUser, SCHAR * pw, SCHAR * dbName, SCHAR * pName) : CPacketHeader(msgType) { strcpy((char *)db_user, (char *)dbUser); strcpy((char *)password, (char *)pw); strcpy((char *)db_name, (char *)dbName); strcpy((char *)program_name, (char *)pName); } // 로그인 응답 생성자 CLoginAuthResPacket::CLoginAuthResPacket(UB2 msgType, UB2 rtnLen, SCHAR * rtnMsg) : CPacketHeader(msgType) { rtn_len = rtnLen; strcpy((char *)rtn_msg, (char *)rtnMsg); } void CLoginAuthReqPacket::CShowPacket() { cout << "[LOGIN AUTH REQ PACKET]" << endl; cout << "[MSG TYPE] : " << msg_type << endl; cout << "[DB USER] : " << db_user << endl; cout << "[PASSWORD] : " << password << endl; cout << "[PROGRAM NAME] : " << program_name << endl; cout << "[DB NAME] : " << db_name << endl; } void CLoginAuthResPacket::CShowPacket() { cout << "[LOGIN AUTH RES PACKET]" << endl; cout << "[MSG TYPE] : " << endl; cout << "[LOGIN RES MSG]" << endl; cout << rtn_msg << endl; };그리고 개인적으로 네트워크 패킷 설계할 때 저는
그리고 개인적으로 네트워크 패킷 설계할 때 저는 이렇게 설계했습니다.
typedef struct _pkt_hdr { int type; } pkt_hdr; typedef struct _pkt_type_a { pkt_hdr hdr; } pkt_type_a; typedef struct _pkt_type_b { pkt_hdr hdr; } pkt_type_b; typedef union _pkt { pkt_hdr hdr; pkt_type_a type_a; pkt_type_b type_b; char padd[PADD_LEN]; } pkt; /** * out_buf: 직렬화된 데이터 */ void serialise_type_a(pkt_typa_a *in_type_a, void *out_buf, int in_len);그리고 직렬화 하는 별도의 함수 구현 하구요.
당연히 구조체 그대로 통째로 보내지 않습니다.
(byte order, memory alignement, 동적할당 데이터들...당연한거죠 ^^)
답변 감사드립니다..ㅜㅜ
감사합니다. 답변 주신 것 깊이 생각해서 적용하겠습니다.
...
에러가 났다고 질문을 할 때에는 에러메시지를 보여주는 편이 대답을 얻을 확률이 높습니다.
댓글 달기