2013-05-09 5 views
5

C++에서 상속을 다루고 있습니다. 나는 두 배열의 덧셈과 뺄셈을위한 프로그램을 작성하고 싶었다. Heres는 내 코드 :'class에 대한 typeinfo'에 대한 정의되지 않은 참조와 '클래스 용 vtable에 대한 정의되지 않은 참조'

#include <iostream> 
#include <cmath> 
#include <sstream> 
using namespace std; 

class root 
{ 
    protected : 

      int size; 
      double *array; 

    public : 

     virtual ~root() {} 
     virtual root* add(const root&) = 0; 
     virtual root* sub(const root&) = 0; 
     virtual istream& in(istream&, root&) = 0; 

     virtual int getSize() const = 0; 
     virtual void setSize(int); 
     virtual int getAt(int) const = 0; 
}; 

class aa: public root 
{ 

    public : 

     aa(); 
     aa(int); 
     aa(const aa&); 
     root* add(const root& a); 
     root* sub(const root& a); 
     istream& in(istream&, root&){} 
     int getSize() const; 
     void setSize(int); 
     int getAt(int) const; 
}; 

class bb: public root 
{ 
public: 
    bb() { } 
    bb(const bb& b) { } 
    root* add(const root& a); 
    root* sub(const root& a); 
    istream& in(istream&, root&){} 
    int getSize() const{} 
    void setSize(int){} 
    int getAt(int) const{} 
}; 

aa::aa() 
{ 
    size = 0; 
    array = NULL; 
} 

aa::aa(int nsize) 
{ 
    size = nsize; 
    array = new double[size+1]; 
    for(int i=0; i<size; i++) 
     array[i] = 0; 
} 

root* aa::add(const root& a) 
{ 
    for (int i=0; i<a.getSize(); i++) 
     array[i] += a.getAt(i); 
    return new aa(); 
} 

root* aa::sub(const root& a) 
{ 
} 

int aa::getSize() const 
{ 
    return size; 
} 

void aa::setSize(int nsize) 
{ 
    size = nsize; 
    array = new double[size+1]; 
    for(int i=0; i<size; i++) 
     array[i] = 0; 
} 

int aa::getAt(int index) const 
{ 
    return array[index]; 
} 

root* bb::add(const root& a) 
{ 
    return new bb(); 
} 

root* bb::sub(const root& a) 
{ 

} 

int main(int argc, char **argv) 
{ 
} 

그러나 나는 이상한 오류가 :

/home/brian/Desktop/Temp/Untitled2.o||In function `root::~root()':| 
Untitled2.cpp:(.text._ZN4rootD2Ev[_ZN4rootD5Ev]+0xb)||undefined reference to `vtable for root'| 
/home/brian/Desktop/Temp/Untitled2.o||In function `root::root()':| 
Untitled2.cpp:(.text._ZN4rootC2Ev[_ZN4rootC5Ev]+0x8)||undefined reference to `vtable for root'| 
/home/brian/Desktop/Temp/Untitled2.o:(.rodata._ZTI2bb[typeinfo for bb]+0x8)||undefined reference to `typeinfo for root'| 
/home/brian/Desktop/Temp/Untitled2.o:(.rodata._ZTI2aa[typeinfo for aa]+0x8)||undefined reference to `typeinfo for root'| 
||=== Build finished: 4 errors, 0 warnings ===| 

그들이 어디서 왔는지 어떻게 '수정'그들, 지금 해달라고에서 잘 모릅니다. 미리 감사드립니다;)

+1

누드 포인터를 사용하지 마십시오. 그냥 가지마. 이것은 끔찍한 코드입니다. (또한, 생성자 이니셜 라이저 목록이 작동하는 방법을 찾아보십시오.) –

답변

12

root::setSize을 추가하여 선언하지 않았기 때문에 그것의 생각한다. 아마도, 그것은 다른 기능으로 순수해야한다 :

virtual void setSize(int) = 0; 
          ^^^ 

당신은 당신이 특정 오류가 있음을 얻는 이유 피투성이의 세부 사항에 관심이 있다면이 컴파일러는 어딘가에 클래스의 가상/RTTI 메타 데이터를 생성해야, 클래스가 비 순수하고 인라인이 아닌 가상 함수를 선언하면 해당 함수의 정의와 동일한 번역 단위로 가상 함수를 생성합니다. 정의가 없으므로 생성되지 않아 오류가 발생합니다.

+1

+1 피투성이의 세부 사항을 제공합니다! – Nick

1

root::setSize은 정의되지 않았으며 순수 가상 함수로 선언되지 않았습니다. 함수의 끝에 (순수 virtal하게) = 0을 추가하거나 root::setSize 함수를 정의하십시오.

1

난 당신이 root

virtual void setSize(int); 

를 구현하거나 가상 순수가 정의되어야합니다 즉, 순수 가상 선언되지 =0

관련 문제