c++ - 是否可以强制通过引用或指针(C++)传递一个类?
问题描述
我不完全确定要搜索什么以查看是否已询问此问题,因此希望它不是重复的。
假设我用 C++ 编写了一个类。是否有可能通过构造函数或其他一些内部(类)机制,在将类传递给非引用函数时引发编译器警告。
这背后的动机只是为了更强有力地控制内存分配。有问题的类有几个在类构造期间分配的内存指针(以及通过各种类成员函数释放/分配)。分配是昂贵的,我想警告开发人员(好吧,老实说,我想警告自己)无关的数据副本。但是,在其他情况下复制类有有效的用例(甚至可能是通过值传递的有效用例……尽管我想不出任何不可避免的用例)。
顺便说一句,类可以按值传递——类副本确实有效。但是,除非需要,否则我不希望调用它。因此编译器警告而不是错误。
一个人为的例子:
class doNotSilentCopy {
public:
doNotSilentCopy(size_t size) {
mysize = size;
dummy = (int*)malloc(mysize);
};
doNotSilentCopy() : doNotSilentCopy(0) {};
doNotSilentCopy(const doNotSilentCopy& rhs) {
this->mysize = rhs.mysize;
this->dummy = (int*)malloc(this->mysize);
};
~doNotSilentCopy(void) {
if (dummy) {
free(dummy);
dummy = nullptr;
mysize = 0;
}
};
int get(int index) {
return *(dummy + index);
};
private:
size_t mysize;
int* dummy;
};
int getDataBad(doNotSilentCopy cls, int index) {
return cls.get(index);
}
int getDataGood(doNotSilentCopy& cls, int index) {
return cls.get(index);
}
int main() {
doNotSilentCopy mycls(10);
int can_I_warn_about_this = getDataBad(mycls, 5);
int this_is_acceptable = getDataGood(mycls, 5);
return 0;
}
解决方案
要得到错误,您将删除复制构造和复制分配。你说过你想保留它们,但不鼓励使用它们。
幸运的是,现代 C++ 对此也有答案——deprecated
属性:
[[deprecated("Please avoid copying objects of this class")]]
DoNotSilentCopy(DoNotSilentCopy const &foo);
[[deprecated("Please avoid copying objects of this class")]]
DoNotSilentCopy &operator=(DoNotSilentCopy const &);
但是请注意,这将导致对对象的任何副本发出警告,而不仅仅是当它作为参数传递时。
Visual Studio 从 VS 2015 开始实现了这一点。
参考
https://docs.microsoft.com/en-us/cpp/cpp/attributes?view=msvc-160
推荐阅读
- javascript - 未找到 Webpack 和 React 图像
- docker - Docker 服务仅对本地主机可用
- python - 从列表 Python 错误中打印 __init__ 对象
- angular - Angular,奇怪的错误(未知 url)的 Http 失败响应:0 Unknown Error using APP_INITIALIZER
- doctrine - (教义)选择数组集合不为空的地方?
- python - Pandas 数据框条件替换和按列修剪
- google-home - 有没有办法创建一个“Action on Google”来回答“Google play X radio”并实际播放流?
- c# - 实例化一个空的 SearchResultCollection
- node.js - 尽管配置,Cypress.io 不采用 index.js
- amazon-web-services - 步骤功能:等待 - 它可以持续多长时间?