我正在围绕 sqlite3 编写一个非常简单和小的包装器,并使用 sqlite3_get_table() 获取结果作为 char**
.我使用一个基数据类来将字段存储在一个统一的容器中,即记录在这里,然后使用派生类型专门获取每个数据类型。
这是我的基类:
class data
{
private:
uint sz;
virtual void abstract() = 0;
public:
inline data(char* pd);
inline data();
uint size() {return sz;}
};
这是示例派生类:
class str : public data
{
private:
string* pdata;
virtual void abstract() {}
public:
inline str(char* pd);
inline operator string();
inline operator const char*();
};
和记录类:
class record
{
private:
ushort cols;
data** entries;
public:
record(char** ppdata, uint col_count);
inline data* operator [](ushort field);
inline uint num_fields() {return cols;}
};
record
的 operator[]
( inline data* operator [](ushort field);
) 允许我访问基地 data
这样上课:
db::str* mys = dynamic_cast<db::str*>((*record)[3]);
并编译:g++ -o main -lsqlite3 main.cpp
在 Arch Linux 下,编译没有问题。但是当我运行它时,我得到 Segmentation Fault
.
注释掉 dynamic_cast 行让我很高兴,但我个人认为我在某种程度上做错了,而不是认为 data
的定义或使用有问题类。
我也感谢任何对我的代码的激进冒犯,因为我知道我是新手。非常感谢。
最佳答案
当您使用dynamic_cast
时,您需要检查结果是否为NULL
。当对象实际上不是您尝试转换为的类型的实例时,就会发生这种情况。
关于C++通过多态和指针自定义异构容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9928175/