【发布时间】:2012-03-29 15:08:10
【问题描述】:
我正在围绕 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]);
在Arch Linux下编译:g++ -o main -lsqlite3 main.cpp,编译没有问题。但是当我运行它时,我得到Segmentation Fault。
注释掉 dynamic_cast 行让我很高兴,但我个人认为我在某种程度上做错了向下转换,而不是认为 data 类的定义或使用存在问题。
我也很欣赏对我的代码的任何激进冒犯,因为我知道我是一个新手。非常感谢。
【问题讨论】:
-
这个
record类在哪里?添加多态行为应该可以让您避免沮丧。 -
我刚刚添加了记录类。除了包含指向
datas 的指针之外,它什么也不做。 -
@sje397 是的,我的目标是添加多态行为,但我应该走错路了。我需要你的帮助! ;-)
标签: c++ inheritance casting