首页 > 解决方案 > 是否可以强制通过引用或指针(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++visual-c++

解决方案


要得到错误,您将删除复制构造和复制分配。你说过你想保留它们,但不鼓励使用它们。

幸运的是,现代 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


推荐阅读