【问题标题】:Cannot convert 'object*' to 'abstract*' in initialization初始化时无法将“object*”转换为“abstract*”
【发布时间】: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


【解决方案1】:

不确定这是错字还是您的代码中的实际情况,但在您的 ServerInterface.cpp 中,您声明了以下内容:

#include "HMDServer.cpp"
#include "Server.cpp"

如果您确实包含 .cpp 文件而不是实际的标头,则可以预料会有奇怪的行为。

也是一样
#include "ServerInterface.cpp"

在你的main.cpp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多