【发布时间】:2016-11-17 04:18:54
【问题描述】:
我正在尝试使用服务器接口来处理多个服务器,具体取决于哪一个可用。简化,代码是这样的:
服务器.h
class Server : public ServerInterface {
public:
Server();
static Server * getServerPtr();
}
服务器.cpp
#include "Server.h"
Server::Server () {}
Server * Server::getServerPtr() {
Server * server = new Server();
return server;
}
HMDServer.h
class HMDServer : public ServerInterface {
public:
HMDServer();
static HMDServer * getHMDServerPtr();
void init();
private:
int server_type;
HMDServer.cpp
#include "HMDServer.h"
HMDServer::HMDServer() {
server_type = 1;
init();
}
HMDServer * HMDServer::returnHMDServerPtr() {
HMDServer * server = new HMDServer();
return server;
}
void HMDServer::init() {
//try to initialize server
server_type = 111; // if initialization successful
}
服务器接口.h
class ServerInterface {
public:
static ServerInterface * getServer();
}
服务器接口.cpp
#include "ServerInterface.h"
#include "HMDServer.cpp"
#include "Server.cpp"
ServerInterface * ServerInterface::getServer() {
ServerInterface * server1 = HMDServer::getHMDServerPtr(); //This works perfectly
if(server1->getServerType() == 1) {
ServerInterface * server2 = Server::getServerPtr();
return server2;
} else
return server1;
}
main.cpp
#include "ServerInterface.cpp"
int main() {
ServerInterface * server = ServerInterface::getServer();
return 0;
}
当我运行此代码时,它进入 getServer() 的 if 函数,当它尝试从 Server 类获取指针时,我收到一条错误消息:
cannot convert 'Server*' to 'ServerInterface*' in initialization.
以前,在我添加服务器文件并且只包含 HMDServer 之前,它可以完美运行。我做错了什么?
【问题讨论】:
-
ServerInterface.cpp 文件中的
ServerInterface * getServer()不应该是ServerInterface * ServerInterface ::getServer()吗?您似乎在实现中遗漏了类名。此外,HMDServer * getHMDServerPtr()被声明为非静态的,但您调用它时就好像它是静态的,并且您的帖子中完全没有实现。 发布真实代码。 -
请显示完整代码。 ServerInterface.cpp 是如何知道 Server 的?
-
感谢 WhozCraig 的回答,这已经在我的实际代码中实现了,我只是忘记在此处包含它。我无法发布整个代码,除非您想查看服务器对象执行的 50 个不同函数,这些函数与对象的构造本身无关,例如 getTime() 等...相关函数在这里,我已经添加#include 文件和 main.cpp 以及您指出的更正。
-
您忘记在此处提供与理解您的问题相关的代码?那么,你希望人们如何帮助你呢?尝试创建一个 MCVE - 一个最小的可编译验证示例 - 以其他人可以重现的方式实际显示症状。
-
您的代码中存在内存泄漏,您应该使用智能指针或更准确或两者兼而有之。
标签: c++ oop pointers abstract-class derived-class