【发布时间】:2019-01-16 13:16:57
【问题描述】:
一个类拥有一个U 类型的对象。通过一种方法,它使用 getter 将此对象公开为const U&(不便宜地复制,不需要修改)。
现在,一个客户想要使用这个 API。他希望将U 的实例用作复杂对象的一部分(它对更改API 对象没有兴趣)。
因此,他至少有以下选择:
创建一个T 类,以const U& 作为参数和一个const U& 类型的私有字段,构造函数在其中存储API 的实例。
这有一个极端的缺点,就是使类的实例非常不灵活(例如,没有使用 std::vectors 的管理),这是不希望的。
不久前,我发现也可以使用std::reference_wrapper<const U> 来存储const U&,这样不会对T 类型的实例造成这些缺点。
现在的问题是,这是否符合预期?这样做是否是一种好习惯?
在下面和here 中,您可以找到使用此策略和描述的类型的工作代码。
#include <iostream>
#include <memory>
class U{
public:
uint value;
};
class T{
private:
std::reference_wrapper<const U> _u;
public:
T(const U& u)
:_u(u) {}
const U& GetU(){
return _u;
}
};
const U& provideValue(U& u){
return u;
}
int main()
{
U internalApiValue;
internalApiValue.value = 5;
auto apiValue = provideValue(internalApiValue);
T container(apiValue);
std::cout << container.GetU().value;
}
我想如果这不是一个好主意,唯一的选择是避免使用 const,因为否则我会对这些方法的用户施加严格的限制(暴露 const U& 而不是 U& 或 U 的方法) ?
【问题讨论】:
-
const U *有什么问题?此外,删除const也无济于事:问题在于 reference 本身不可分配。 -
@Quentin
const U *让您了解终身问题。虽然您仍然可以通过引用来解决问题,但这样做确实会违反“规则”。 -
@NathanOliver 我提倡
const U &用于参数,const U *用于存储,假设遵循“无原始拥有指针”规则。 -
@昆汀啊。这是有道理的。
-
感谢昆汀的回答和您的意见,其实我没有考虑过。
标签: c++ constructor reference constants