使带有参考成员的类可复制和移动

时间:2019-11-09 07:47:47

标签: c++

我上课

class Route
{
    public:
    Route(std::vector<int> locationIds, const ILocationSource&);
    double getRouteLength() const;
    bool operator<(const Route&);

    private:
    std::vector<int> locationIds_;
    const ILocationSource& locationSource_;
};

getRouteLength()通过遍历locationIds_并从ILocationSource获取坐标来计算路线长度:

class ILocationSource
{
    public:
    virtual Location getLocation(size_t n) = 0;
};

struct Location
{
    double x, y, z;
}

我不想将坐标存储在Route中,因为Location大约是int ID的6倍,如果我在其中有很多长途路线,这可能很重要记忆。

问题在于Route::locationSource_使得实现移动语义变得困难,因此尝试在std::sort()上抱怨调用std::vector<Route>

我想,简单的解决方案是将locationSource_更改为指向const的指针,但我想知道是否有人可以看到更好的解决方案或模式。不能选择单例,因为同时可以实现ILocationService的几种实现。

1 个答案:

答案 0 :(得分:1)

您应该只使用shared_ptr而不是引用:

std::shared_ptr<const ILocationSource> locationSource_;

它解决了您的复制/移动问题,并且您在ILocationSource实例上拥有(共享)所有权,这保证了ILocationSource只要Route需要它就可以存在。

除此之外,请考虑通过ref或locationIds ref传递const