将接口与实现结合时的 C++ 链接器错误

时间:2021-05-30 00:26:14

标签: c++

我是 C++ 的新手,我正在尝试使用接口及其实现。 Container 应该是一个接口,而 Vector 是它的实现。我在以下 C++ 文件的链接阶段遇到错误。它是单个文件 Vector.cpp,如下所示:

#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";
}

当我编译代码时,我收到似乎来自链接器 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

0 个答案:

没有答案
相关问题