이 문제에 대한 질문을 보았지만 저에게 맞는 해결책을 찾을 수 없습니다. 저는 C ++에서 Visual Code를 사용하고 있으며 C ++ 버전은 C ++ 11보다 앞선 것입니다. 저는 DNS 클래스를 가지고 있으며, 다양한 클래스가 주 DNS 메시지 클래스를 상속합니다. 이런 식으로 일부 특성을 분해 할 수 있습니다. 유형 유형 필드의 기능에서 나는 객체의 유형을 알 수 있습니다. 예를 들어 컴파일 할 때 "DNS_RR_A에 대한 typeinfo에 대한 정의되지 않은 참조"라는 오류가 발생하지만 개체의 클래스를 확인하기 위해 수행중인 각 동적 캐스트에서이 오류가 발생했습니다.
내 dnsMessage.cpp에는 생성자와 소멸자 만 있습니다.
내 수업은 다음과 같습니다.
class CDnsMessage
{
public:
CDnsMessage();
virtual ~CDnsMessage();
virtual void GetSize() = 0;
uint32_t m_ttl;
eDnsClass m_class;
eDnsType m_type;
std::string m_domain;
uint8_t m_sizeDnsCorpse;
uint8_t m_sizeDomainName;
};
class CDns_RR_A : public CDnsMessage
{
public:
CDns_RR_A();
virtual ~CDns_RR_A();
virtual void GetSize() {/*....*/}
uint32_t m_address;
};
다음은 동적 캐스트에서 오류와 함께 사용하는 함수의 샘플입니다. 인코딩해야하는 메시지를 받았지만 메시지의 성격을 모르기 때문에 동적으로 캐스트하여 인코딩을 조정할 수 있습니다.
//i receive a message i have to encode, i don't know the type
void EncodeOpaqueData(CDnsMessage & msg, std::vector<uint8_t>& output)
{
//where i encode
output.clear();
// Error : "undefined reference to `typeinfo for CDns_RR_A'"
if(dynamic_cast< CDns_RR_A* >( &msg ) != NULL)
{
CDns_RR_A* RR_A_msg = dynamic_cast< CDns_RR_A* >( &msg );
uint16_t dnstype = cmn_hton16(1);
output.push_back(dnstype);
output.push_back(dnstype >> 8);
/* stuff here */
uint32_t address = cmn_hton32(RR_A_msg->m_address);
for (int i = 0; i < 4; i++)
{
output.push_back(static_cast<uint8_t>(address >>(i * 8)));
}
}
}
함수에 대해 더 많이 생각 해본 후에 객체의 유형을 확인하는 대신 msg-> m_type을 확인하고 해당 유형의 함수에 적응할 수 있습니다. 예를 들어 m_type 변수가 잘못 인스턴스화 될 수 있습니다. 그러나 어쨌든이 오류와 수정 방법을 이해하고 싶습니다. 미리 감사드립니다.
클래스 장애 (가상 메서드 테이블 및 typeinfo)는 처음 선언 된 가상 메서드가 컴파일 될 때 생성됩니다. 당신이 정의하는virtual ~CDnsMessage();
(즉 CDnsMessage::~CDnsMessage() {}
)과하면이 링크에 포함하여 정의되어있는 파일입니다.
라인 외부 정의는 약하지 않으므로 정확히 하나의 소스 (헤더 아님) 파일에 정의해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다