c++ - C++ const 方法返回非 const 指针
问题描述
作为学习 C++ 的练习,我创建了以下封装类,它封装了一个简单字符缓冲区的创建/销毁:
class BufferClass {
private:
char *mBufferPtr;
public:
BufferClass(int pSize)
: mBufferPtr(new char[pSize]) {}
virtual ~BufferClass() {
delete[] mBufferPtr;
}
operator char*() {
return mBufferPtr;
}
operator const char*() const {
return mBufferPtr;
}
};
如果在某种情况下我想创建此类的 const 实例(即我无意在构造后修改对象),但必须将它与仅接受非 const char* 指针的 C API 结合使用(甚至认为它不会改变数据),允许以下内容的普遍共识是什么:
operator char*() const {
return mBufferPtr;
}
我意识到我可以只创建 Buffer 类的非常量实例,但我会对有关这种方法有效性的评论感兴趣。
解决方案
你应该正确地设计你的课程。所以,如果这是一个const
成员函数,那么它不应该允许以任何方式修改对象的数据。与 C API 的兼容性不是此类的责任,因此如果需要(const_cast
'ing、复制到另一个缓冲区等),应该在外部解决它。
此外,您可能还可以为该 C API 编写一些包装器:
- 在公共接口中使用正确的常量并转换为内部所需的常量(如果确实需要)
- 另外制作 C++ 接口,如果它更有用的话
推荐阅读
- java - AmazonSNSClient noClassDefFound
- angular - Angular 5 plunker,无法解析所有参数
- c++ - 如何从 QPushButton 中恢复项目?
- php - php如何在后台连续调用函数?
- javascript - 在 Vue.js 中将 props 传递给根实例
- git - Git 状态显示 git reset 后的更改——hard, 2nd checkout——删除更改
- oracle - Oracle 自动在多记录块中插入记录第 2 部分
- php - 如何将变量附加到魔术方法PHP?
- ruby-on-rails - 如何使用 Bootstrap 警报自定义设计的确认消息?
- java - 将整数格式化为 %d 和 %s 有什么区别?