初始化其构造函数引用的基类

时间:2017-09-12 17:09:44

标签: c++ c++11

初始化基类时出现以下错误,该基类的构造函数使用临时对象(jsonrpc::HttpServer(port))进行引用。我认为std::move适用于这种情况,但std::move(jsonrpc::HttpServer(port)也不起作用。有什么想法吗?

class Server : public jsonrpc::AbstractServer<Server>
{
    public:
        Server(jsonrpc::AbstractServerConnector &conn) : jsonrpc::AbstractServer<Server>(conn)
        {
            //...
        }
};

class MyServer: public Server {
    public: MyServer(int port);
}

// error
MyServer::EnclaveRPC(int port):Server(jsonrpc::HttpServer(port)){}
MyServer::EnclaveRPC(int port):Server(std::move(jsonrpc::HttpServer(port))){}
  

错误:从'jsonrpc :: AbstractServerConnector'类型的右值开始,无效初始化'jsonrpc :: AbstractServerConnector&amp;'类型的非const引用    :服务器(jsonrpc :: HttpServer(port)){

3 个答案:

答案 0 :(得分:4)

MyServer::EnclaveRPC(int port):Server(jsonrpc::HttpServer(port)){}

在这里创建一个类型为jsonrpc::HttpServer(rvalue)的临时对象,并尝试将其作为左值引用传递,这是有充分理由的。 jsonrpc::AbstractServer可以将它存储为成员(很可能是它)以便稍后使用它,但是在执行程序的下一行之前将删除temp对象

P.S。

jsonrpc库提供了jsonrpc::AbstractServer的弱接口。它应该取得连接的所有权(例如std::unique_ptr)或至少std::shared_ptr的共享所有权

答案 1 :(得分:2)

您的班级不是jsonrpc::AbstractServerConnector的所有者,因为参考不带有所有权。

就此而言,您必须将它发送给您,因为所有者是外部的:

struct Server : jsonrpc::AbstractServer<Server>
{
        Server(jsonrpc::AbstractServerConnector& conn) : jsonrpc::AbstractServer<Server>(conn)
        {
            //...
        }
};

struct MyServer : Server {
    MyServer(jsonrpc::AbstractServerConnector& conn) : Server{conn} {}
};

这可能就是你所需要的。

但是,如果您坚持成为资源的所有者,则可以创建一个属于您的第一个父级的拥有类:

struct HttpConnectionOwner {
    explicit HttpConnectionOwner(int port) : conn{port} {}

    jsonrpc::HttpServer conn;
};

struct MyServer : HttpConnectionOwner, Server {
    explicit MyServer(int port) : HttpConnectionOwner{port}, Server{conn} {}
};

此外,如果您有许多连接类型,您可以让您的班级选择您需要的连接类型:

template<typename ConnectionType>
struct MyServer : ConnectionType, Server {
    using ConnectionType::conn; // conn is now a dependent name

    explicit MyServer(int port) : ConnectionType{port}, Server{conn} {}
};

using MyHttpServer = MyServer<HttpConnectionOwner>;
using MyWebSocketServer = MyServer<WebSocketConnectionOwner>;

答案 2 :(得分:0)

您可以随时使用指针,但为了100%安全,请将其设为unique_ptrshared_ptr,如下所示:

class testTempUnique {
public:
  testTempUnique(unique_ptr<int> &inPtr)
    : myPtr{ std::move(inPtr) } { }

  unique_ptr<int> myPtr;
};
auto mygeneratedClass = testTempUnique(make_unique<int>(5));
cout << "value inside is: " << *(mygeneratedClass.myPtr) << endl;

我有一个int,但你明白了。如果您想要使对象在其他地方“有效”,请使用shared_ptr<T>代替。