我上课
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
的几种实现。
答案 0 :(得分:1)
您应该只使用shared_ptr而不是引用:
std::shared_ptr<const ILocationSource> locationSource_;
它解决了您的复制/移动问题,并且您在ILocationSource
实例上拥有(共享)所有权,这保证了ILocationSource
只要Route
需要它就可以存在。
除此之外,请考虑通过ref或locationIds
ref传递const
。