添加析构函数后对 vtable 的未定义引用
Undefined Reference to vtable After Adding Destructor
我查看了Undefined reference to vtable,但即使在添加析构函数后我仍然遇到类似的错误:
main.cpp:(.text._ZN8isStringC2Ev[_ZN8isStringC5Ev]+0xf): undefined reference to `vtable for isString'
/usr/bin/ld: /tmp/ccVCX8sf.o: in function `isString::~isString()':
main.cpp:(.text._ZN8isStringD2Ev[_ZN8isStringD5Ev]+0xf): undefined reference to `vtable for isString'
/usr/bin/ld: /tmp/ccVCX8sf.o:(.data.rel.ro._ZTI8MyString[_ZTI8MyString]+0x10): undefined reference to `typeinfo for isString'
/usr/bin/ld: /tmp/ccVCX8sf.o:(.data.rel.ro._ZTI14CStringAdapter[_ZTI14CStringAdapter]+0x10): undefined reference to `typeinfo for isString'
collect2: error: ld returned 1 exit status
以下代码正在创建我自己的字符串 class,但使用了 cstrings 的适配器。它们(MyString 和 CStringAdapter classes)继承自纯虚拟 class isString。我只是想了解如何使用适配器;我知道创建自己的字符串 class 是毫无意义的。
我正在使用 C++ 17。
#include <iostream>
#include <cstring>
using namespace std;
class isString{
public:
virtual ~isString()=default;
virtual const char* getBuffer()const;
virtual size_t size()const;
};
class CStringAdapter: public isString{
protected:
string str;
public:
CStringAdapter(): str{""} {}
CStringAdapter(const char* newStr): str{newStr} {}
~CStringAdapter()=default;
const char* getBuffer() const override { return str.c_str(); }
size_t size() const override { return str.size(); }
};
class MyString: public isString{
protected:
string str;
public:
MyString():str{""} {}
MyString(const char* newCStr) { *this = newCStr; }
MyString(const MyString& newStr) { *this = newStr; }
~MyString()=default;
MyString& Assign(const isString& myStr, const isString& aStr){
memcpy(const_cast<char*>(myStr.getBuffer()), aStr.getBuffer(), aStr.size());
return *this;
}
MyString& operator=(const MyString& aString){ return Assign(*this, aString); }
MyString& operator=(const char* aCString){ return Assign(*this, CStringAdapter(aCString)); }
const char* getBuffer() const override { return str.c_str(); }
size_t size() const override { return str.size(); }
};
int main()
{
MyString str1{"Hello World"};
return 0;
}
您没有定义成员函数 isString::getBuffer
和 isString::size
。你需要定义它们。
如果您不希望class定义这些函数,您必须将它们标记为纯虚拟,使isString
成为一个抽象无法直接实例化的基class:
virtual const char* getBuffer() const = 0;
virtual size_t size() const = 0;
我查看了Undefined reference to vtable,但即使在添加析构函数后我仍然遇到类似的错误:
main.cpp:(.text._ZN8isStringC2Ev[_ZN8isStringC5Ev]+0xf): undefined reference to `vtable for isString'
/usr/bin/ld: /tmp/ccVCX8sf.o: in function `isString::~isString()':
main.cpp:(.text._ZN8isStringD2Ev[_ZN8isStringD5Ev]+0xf): undefined reference to `vtable for isString'
/usr/bin/ld: /tmp/ccVCX8sf.o:(.data.rel.ro._ZTI8MyString[_ZTI8MyString]+0x10): undefined reference to `typeinfo for isString'
/usr/bin/ld: /tmp/ccVCX8sf.o:(.data.rel.ro._ZTI14CStringAdapter[_ZTI14CStringAdapter]+0x10): undefined reference to `typeinfo for isString'
collect2: error: ld returned 1 exit status
以下代码正在创建我自己的字符串 class,但使用了 cstrings 的适配器。它们(MyString 和 CStringAdapter classes)继承自纯虚拟 class isString。我只是想了解如何使用适配器;我知道创建自己的字符串 class 是毫无意义的。 我正在使用 C++ 17。
#include <iostream>
#include <cstring>
using namespace std;
class isString{
public:
virtual ~isString()=default;
virtual const char* getBuffer()const;
virtual size_t size()const;
};
class CStringAdapter: public isString{
protected:
string str;
public:
CStringAdapter(): str{""} {}
CStringAdapter(const char* newStr): str{newStr} {}
~CStringAdapter()=default;
const char* getBuffer() const override { return str.c_str(); }
size_t size() const override { return str.size(); }
};
class MyString: public isString{
protected:
string str;
public:
MyString():str{""} {}
MyString(const char* newCStr) { *this = newCStr; }
MyString(const MyString& newStr) { *this = newStr; }
~MyString()=default;
MyString& Assign(const isString& myStr, const isString& aStr){
memcpy(const_cast<char*>(myStr.getBuffer()), aStr.getBuffer(), aStr.size());
return *this;
}
MyString& operator=(const MyString& aString){ return Assign(*this, aString); }
MyString& operator=(const char* aCString){ return Assign(*this, CStringAdapter(aCString)); }
const char* getBuffer() const override { return str.c_str(); }
size_t size() const override { return str.size(); }
};
int main()
{
MyString str1{"Hello World"};
return 0;
}
您没有定义成员函数 isString::getBuffer
和 isString::size
。你需要定义它们。
如果您不希望class定义这些函数,您必须将它们标记为纯虚拟,使isString
成为一个抽象无法直接实例化的基class:
virtual const char* getBuffer() const = 0;
virtual size_t size() const = 0;