我有使用前向聲明和虛函數的問題。編譯期間我收到以下錯誤消息。C++前向聲明和純虛函數
main.cpp:131: error: cannot allocate an object of abstract type ‘Database::MySQL’
database_mysql.h:31: note: because the following virtual functions are pure within ‘Database::MySQL’:
database.h:28: note: virtual void Database::Interface::query(const char*, QueryResult&)
database.h:29: note: virtual void Database::Interface::query(std::string, QueryResult&)
database.h:30: note: virtual bool Database::Interface::step(QueryResult&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)
編譯器說這些函數仍然是純虛函數,但是我正確地聲明和定義了它們。我不知道問題是什麼。
這是我的源代碼。
// database.h
class QueryResult;
namespace Database
{
class Interface {
public:
Interface() {};
virtual ~Interface() {};
virtual void query(const char *sql) = 0;
virtual void query(std::string sql) = 0;
virtual void query(const char *sql, QueryResult &result) = 0;
virtual void query(std::string sql, QueryResult &result) = 0;
virtual bool step(QueryResult &result,
std::vector<std::string> &row) = 0;
};
}
// database_mysql.h
namespace Database
{
class MySQL : public Interface {
public:
class QueryResult {
public:
QueryResult();
~QueryResult() ;
void set(MYSQL_RES *result);
MYSQL_RES *get();
private:
MYSQL_RES *_result;
};
...
void query(const char *sql);
void query(std::string sql);
void query(const char *sql, QueryResult &result);
void query(std::string sql, QueryResult &result);
bool step(QueryResult &result, std::vector<std::string> &row);
...
};
}
// database_mysql.cpp
Database::MySQL::QueryResult::QueryResult()
: _result(NULL)
{
}
Database::MySQL::QueryResult::~QueryResult()
{
...
}
void Database::MySQL::QueryResult::set(MYSQL_RES *result)
{
...
}
MYSQL_RES *Database::MySQL::QueryResult::get()
{
...
}
void Database::MySQL::query(const char *sql)
{
...
}
void Database::MySQL::query(std::string sql)
{
...
}
void Database::MySQL::query(const char *sql, QueryResult &result)
{
...
}
void Database::MySQL::query(std::string sql, QueryResult &result)
{
...
}
/* @return: false on done or true if remained rows exist */
bool Database::MySQL::step(QueryResult &result, std::vector<std::string> &row)
{
...
}
謝謝。
您必須顯示main.cpp中的內容:131,以便我們可以爲您提供幫助。您的具體類是正確定義的,但我懷疑您沒有正確實例化對象。 另外,正如@anders指出的那樣,您的QueryResult類應該屬於Interface.h文件。 – 2010-08-10 04:57:05
@Edison Gustavo Muenz:這個錯誤可以通過嘗試創建一個'Database :: MySQL'類的實例來複制。 – Naveen 2010-08-10 05:11:13