我正在尝试创建一种表,并管理我决定创建这些类的所有数据:
[Column.h
,Tab.h
,Database.h
,模板ColumnImpl.h
和某些继承的类,例如IntColumn.h
,FloatColumn.h
等]
class Column {
public:
Column();
virtual ~Column();
virtual string getType() = 0;
};
template <typename T> class ColumnImpl : public Column {
public:
ColumnImpl();
ColumnImpl(const T& to_set);
vector<T> const& getData() const { return _data; }
void addElem(const T& elem_to_add);
void operator=(const ColumnImpl& to_assign);
protected:
vector<T> _data;
};
class Tab {
public:
Tab();
~Tab();
void addColumn(string name, string type);
void addRecord(string column);
void operator=(const Tab& to_assign);
private:
map<string, shared_ptr<Column>> _columns;
int _primary_key;
};
class Database {
public:
Database();
~Database();
void createNewTable(string name);
void addColumnToTab(string tab_name, string col_name, string type);
private:
map<string, Tab> _tables;
};
如果我尝试构建项目,则会收到错误:undefined reference to TimeColumn::TimeColumn()
,并且对于所有其他派生类和Tab.h
都是相同的。由于我以前从未与继承有关,而且我实际上也是stl
的新手,所以我无法理解我要执行的操作是什么问题。
所有错误均参考以下代码行(我使用所有列类型进行此操作:]
_columns[name].reset(new IntColumn()); // This line it's inside a method where 'name' is a std::string
编辑:我添加了更多代码
void Database::createNewTable(string name) {
_tables[name] = Tab();
}
void Database::addColumnToTab(string tab_name, string col_name, string type) {
const auto & it_target_tab = _tables.find(tab_name);
it_target_tab->second.addColumn(col_name, type);
}
void Tab::operator=(const Tab &to_assign) {
_columns = to_assign._columns;
}
就是全部,其余各行是ColumnImpl.cpp
中的方法,其中包含1个push_back或基本内容...
使用Apple clang版本11.0.0(clang-1100.0.33.8)编译时没有错误:
#include <vector>
#include <string.h>
#include <map>
using namespace std;
class Column {
public:
Column(){}
virtual ~Column(){}
virtual string getType() = 0;
};
template <typename T> class ColumnImpl : public Column {
protected:
vector<T> _data;
public:
ColumnImpl():Column(){}
ColumnImpl(const T& to_set){}
vector<T> const& getData() const { return _data; }
void addElem(const T& elem_to_add){}
void operator=(const ColumnImpl& to_assign){}
};
class Tab {
public:
Tab(){}
~Tab(){}
void addColumn(string name, string type){}
void addRecord(string column){}
void operator=(const Tab& to_assign){}
private:
map<string, shared_ptr<Column> > _columns;
int _primary_key;
};
class Database {
public:
Database(){}
~Database(){}
void createNewTable(string name){
_tables[name] = Tab();
}
void addColumnToTab(string tab_name, string col_name, string type){
const auto & it_target_tab = _tables.find(tab_name);
it_target_tab->second.addColumn(col_name, type);
}
private:
map<string, Tab> _tables;
};
只需执行所有主体。