gpt4 book ai didi

C++ 前向声明和纯虚函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:21:52 26 4
gpt4 key购买 nike

我在使用前向声明和虚函数时遇到问题。我在编译期间收到以下错误消息。

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)
{
...
}

谢谢。

最佳答案

因为前向声明编译器正在全局命名空间中寻找类 QueryResult。您在 MySQL 类中定义的函数使用内部类(位于命名空间内)QueryResult。这被编译器视为重载,而不是纯虚函数的实现。我建议解决这个问题是删除前向声明并使 QueryResult 成为接口(interface) Interface 的内部类(把它放在那里是有意义的,否则没有用界面)。然后它将正确编译。

关于C++ 前向声明和纯虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3446132/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com