0

I am new to C++ and I am trying to play around with interface and its implementation. The Container is supposed to be an interface while Vector is its implementation. I am getting an error during the linking phase of the following c++ file. It is a single file Vector.cpp as shown below:

#include<iostream>
using namespace std;

class Container {
    public:
        virtual int size() = 0;
        virtual double& operator[](int) = 0;
        virtual ~Container();
};

class Vector: public Container {

    private:
        double *elem;
        int sz;

    public:
        Vector(initializer_list<double> lst):
            elem  {new double[lst.size()]}, sz {static_cast<int>(lst.size())} {
            copy(lst.begin(), lst.end(), elem); 
        }

        int size() {
            return sz;
        }

        double& operator[](int i) {
            return elem[i];
        }

        ~Vector() {
            cout << "Deallocating elem array\n";
            delete[] elem;
        }

    };

Vector buildVector() {
    Vector v = {1, 3, 5, 6};
    return v;
}

int main() {
    Vector v = buildVector();
    for(int i = 0; i < v.size(); ++i) {
        cout << v[i] << "\n";
    } 
    cout << "Finishing main\n";
}

When I compile the code I get the following error that seems to be coming from the linker ld:

$ g++ -std=c++11 Vector.cpp 

/tmp/ccLibNob.o: In function `Container::Container()':
Vector.cpp:(.text._ZN9ContainerC2Ev[_ZN9ContainerC5Ev]+0x9): undefined reference to `vtable for Container'
/tmp/ccLibNob.o: In function `Vector::Vector(std::initializer_list<double>)':
Vector.cpp:(.text._ZN6VectorC2ESt16initializer_listIdE[_ZN6VectorC5ESt16initializer_listIdE]+0xc4): undefined reference to `Container::~Container()'
/tmp/ccLibNob.o: In function `Vector::~Vector()':
Vector.cpp:(.text._ZN6VectorD2Ev[_ZN6VectorD5Ev]+0x4c): undefined reference to `Container::~Container()'
/tmp/ccLibNob.o:(.rodata._ZTI6Vector[_ZTI6Vector]+0x10): undefined reference to `typeinfo for Container'
collect2: error: ld returned 1 exit status

sshekhar1980
  • 327
  • 2
  • 12
  • 1
    Try changing `virtual ~Container();` to `virtual ~Container(); {}` (or `virtual ~Container() = default;`)`. Your base destructor needs a body. Also, it might be wise to read up on the [rule of 3](https://en.cppreference.com/w/cpp/language/rule_of_three). – Paul Sanders May 30 '21 at 00:30
  • 1
    See https://stackoverflow.com/questions/3065154/undefined-reference-to-vtable – Chimera May 30 '21 at 00:31
  • Yes @Chimera that helped understand the issue! – sshekhar1980 May 30 '21 at 00:33

0 Answers0