[C++] 파일분할 클래스 상속, 그리고 vtable 오류 질문드립니다
글쓴이: kimhyuns55 / 작성시간: 목, 2018/05/17 - 2:34오후
shape.h
#ifndef __SHAPE_H__ #define __SHAPE_H__ class CShape { protected: int x, y; public: CShape(int a, int b) : x(a), y(b) {} void Move(int a, int b) {x += a; y += b;} virtual void Print() = 0; }; #endif
rect.h
#include "shape.h" #ifndef __RECT_H__ #define __RECT_H__ class CRect : public CShape { private: int Garo, Sero; public: CRect(int a, int b, int g, int s); double GetArea(); virtual void Print(); }; #endif
rect.cpp
#include "shape.h" #include <iostream> #include "rect.h" using namespace std; CRect::CRect(int a, int b, int g, int s) : CShape(a, b), Garo(g), Sero(s) {} double CRect::GetArea() {return (Garo* Sero);} void Print() {cout << "test" << endl;}
circle.h
#include "shape.h" #ifndef __CIRCLE_H__ #define __CIRCLE_H__ class CCircle : public CShape{ private: double Radius; public: CCircle(int a, int b, double r); double GetArea(); void Print(); }; #endif
circle.cpp
#include "shape.h" #include "circle.h" #include <iostream> using namespace std; CCircle::CCircle(int a, int b, double r) : CShape(a, b), Radius(r) {} double CCircle::GetArea() { return (3.14 * Radius * Radius);} void Print() {cout<< "testc" <<endl;}
main.cpp
#include <iostream> using namespace std; #include "shape.h" #include "circle.h" #include "rect.h" ostream& operator<< (ostream &out, CShape &Po) { Po.Print(); } int main() { CCircle Cir(1, 1, 1); CRect Rect(2, 2, 2, 2); CShape *pSpe; pSpe = &Cir; cout << *pSpe; pSpe = &Rect; cout << *pSpe; return 0; }
간단히 설명드리자면, rect 와 circle의 면적을 출력하기 위해서 shape클래스의 Print 함수를 가상함수로 설정해본 코드입니다
제 기대와는 다르게 여러부분에서 오류가 발생하더군요 ㅠ
아래가 그 리스트입니다
/tmp/cckeSZdQ.o: In function `Print()': circle.cpp:(.text+0x70): multiple definition of `Print()' /tmp/ccmv69yx.o:rect.cpp:(.text+0x6d): first defined here /tmp/ccmv69yx.o: In function `CRect::CRect(int, int, int, int)': rect.cpp:(.text+0x34): undefined reference to `vtable for CRect' /tmp/cckeSZdQ.o: In function `CCircle::CCircle(int, int, double)': circle.cpp:(.text+0x32): undefined reference to `vtable for CCircle' collect2: ld returned 1 exit status
Q.
1) rect 와 circle 모두 shape를 상속받은 클래스인데, 왜 중복정의를 했다고 오류를 내는것인가요?
2) 이 경우에서의 vtable 오류는 도대체 어떻게 처리해야 하는건가요?
질문하기에 코드가 조금 길어서 불편을 드리게 됬지만
어떻게해서든 오류의 이유를 알고 싶습니다
아무쪼록 도움 부탁드리겠습니다!
Forums:
1) 에러 메세지를 잘 읽으셔야지요~. 중복 정의는
1) 에러 메세지를 잘 읽으셔야지요~. 중복 정의는 Print 함수이지 CRect 나 CCircle이 아닙니다. Print를 정의할 때에 class name qualifier를 깜박하셨어요.
2) Print를 제대로 정의하면 아마 2)도 해결될듯 합니다. (참고 https://gcc.gnu.org/faq.html#vtables)
부끄럽습니다 ㅠㅠ
정말 바보같은 실수를 해놓고 질문글을 올려버렸네요..
정말 부끄러워집니다 :'(
문제는 덕분에 해결되었습니다
답변 감사드립니다 ㅠㅠ
참고로 -v 옵션을 넣고 실행해보시고, c/c++ 의
참고로 -v 옵션을 넣고 실행해보시고, c/c++ 의 오류메시지는 크게 전처리기(cpp), 컴파일러(cc, c++), 링커(ld)로 구별됩니다. 위의 문제는 링커의 문제입니다.
---
http://coolengineer.com
댓글 달기