- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当函数不修改对象参数时,我总是让它请求一个常量引用,即使引用的对象不是真正的常量。这是错误的吗?
对于包装类,我想这样写:
template<class B>
class Wrapper{
private:
B* base_;
public:
Wrapper(const B& b) { base_ = const_cast<B*>(&b); }
void ModifyBase();
};
构造函数不修改基类,因此它要求常量引用。
包装器有一些方法需要修改基类,因此它需要存储一个非常量指针(因此需要进行转换)。
我觉得我的解决方案不是最好的。
有更好的方法吗?
是否有公认的约定?
最佳答案
当您选择参数作为 const
引用时,您是在告诉用户“您可以相信,如果您向我传递一个对象,它不会[通过此引用]被修改† ”你应该尽可能经常这样做,因为用户可以通过查看类型来更多地了解你的函数将做什么和不做什么。此外,传递可变引用可能会导致代码难以推理。
但是,在您的问题中,您的 const
并没有说实话。它抛弃了 const
特性并存储了一个非 const
指针——这意味着该对象很可能会被修改。你欺骗了用户!构造函数本身对对象没有任何作用并不重要。它允许它被其他成员函数修改。这是不好的行为。您的构造函数不应采用 const
引用。
不仅如此,您当前的实现还允许未定义的行为。即使将最初声明为 const
的对象提供给您的 Wrapper
,它也不在乎。它抛弃了它的 const
特性,并允许其他成员函数修改它。修改最初为 const
的对象是未定义的行为。
† 查看 6502 的评论
关于c++ - 良好做法 : Constant to non-constant cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24371322/
嗨,我正在考虑开发一种文件传输程序,想知道我是否想要尽可能好的加密,我应该使用什么? 我会用 C# 开发它,所以我可以访问 .net 库 :P在我的 usb 上有一个证书来访问服务器是没有问题的,如果
我创建的这个计算两个数组的交集是线性的方法的复杂度(在良好、平均、最差的情况下)? O(n) public void getInt(int[] a,int[] b){ int i=0; int
我已经能够使用 RTCPeerConnection.getStats() API 获得 WebRTC 音频调用的各种统计信息(抖动、RTT、丢包等)。 我需要将整体通话质量评为优秀、良好、一般或差。
基本问题: 如果我正在讲述/修改数据,我应该通过索引硬编码索引访问文件的元素,即 targetFile.getElement(5);通过硬编码标识符(内部翻译成索引),即 target.getElem
在 Linux 上,我想知道要调用什么“C”API 来获取每个 CPU 的统计信息。 我知道并且可以从我的应用程序中读取 /proc/loadavg,但这是系统范围的负载平均值,而不是每个 CPU 的
在客户端浏览器中使用 fetch api,GET 或 POST 没有问题,但 fetch 和 DELETE 有问题。它似乎将 DELETE 请求方法更改为 OPTIONS。 大多数研究表明是一个cor
我是一名优秀的程序员,十分优秀!