Undefined reference to `typeinfo for class' and undefined reference to `vtable for class' [duplicate]

StackOverflow https://stackoverflow.com/questions/16460522

  •  19-04-2022
  •  | 
  •  

سؤال

I'm dealing with inheritance in C++. I wanted to write a program for addition and subtraction of two arrays. Heres my code:

#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)
{
}

But I have a strange errors:

/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 ===|

dont know from where they came from, dont now how to 'fix' them. Thanks in advance;)

هل كانت مفيدة؟

المحلول

root::setSize isn't declared pure virtual, which means it must be defined. Presumably, it should be as pure as the other functions:

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

If you're interested in the gory details of why you get that particular error: this compiler needs to generate the class's virtual/RTTI metadata somewhere and, if the class declares a non-pure, non-inline virtual function, it will generate it in the same translation unit as that function's definition. Since there is no definition, they don't get generated, giving that error.

نصائح أخرى

Your root::setSize is not defined, and not declared an pure virtual function. Either add = 0 to the end of the function (making it pure virtal), or define a root::setSize function.

I believe it's because you haven't implemented

    virtual void setSize(int);

in root or declared it as pure virtual by adding =0

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top