注册 登录
编程论坛 C语言论坛

delete用在赋值语句中,有这种用法吗?

weikong66 发布于 2023-07-06 14:12, 961 次点击
有人编写了一个类,其中有下面3条语句:
    TransmitSignals(const TransmitSignals &) = delete ;
    TransmitSignals(const TransmitSignals &&) = delete;
    TransmitSignals &operator=(const TransmitSignals &) = delete;
我使用了这个类。在编译时这3条语句出错。我也感觉delete的这种用法没见过。请问哪位高手能说明一下该delete的用法对不对?
8 回复
#2
forever742023-07-06 15:10
看起来不是C,尽管我不懂,但是我建议楼主,到合适的板块,说清是什么语言,什么开发环境,编译时出什么错,截个图啥的。
然后也许没准儿还需要进一步了解前置声明什么的。
#3
八画小子2023-07-06 15:20
首先,给楼主说一下,你来错地方了,这属于C++的范畴,而非C语言。
其次,既然你问道了,就顺便给说一下,= delete表示告诉编译器该类无对应的构造函数。
最后,顺便给你也说一下,和=delete对应的还有=default。这个的意思是说让编译器自动生成对应的构造函数,作为程序员的你,不必要写这些函数。
最后的最后,给你说一下,个人建议最好用=delete,而不是无=delete或用=default,除非你确定会发生什么。
#4
weikong662023-07-06 22:54
回复 3楼 八画小子
我这就是从C++语言环境里看到的一个自定义类:
//TransmitSignals.h
class TransmitSignals : public QObject
{
    Q_OBJECT
public:
      static TransmitSignals &GetInstance();
private:
    TransmitSignals();
     ~TransmitSignals();

    TransmitSignals(const TransmitSignals &) = delete ; ← //编译器报语法错误
    TransmitSignals(const TransmitSignals &&) = delete; ← //编译器报语法错误
    TransmitSignals &operator=(const TransmitSignals &) = delete;  ← //编译器报语法错误


signals:
    void mid_signal_1();
    void mid_signal_2(int state);
    void mid_signal_3();

public slots:


};


//TransmitSignals.cpp
#include "TransmitSignals.h"

TransmitSignals &TransmitSignals::GetInstance()
{
    static TransmitSignals RobotControl;
    return RobotControl;
}

TransmitSignals::TransmitSignals()
{

}

TransmitSignals::~TransmitSignals()
{

}
这个类有构造函数和析构函数的定义。 出错就是 = delete 的用法。编写这个自定义类的作者,把“= delete”用在了2个复制构造函数和一个操作符重载函数上,究尽要表达一个什么意义?而且这种表达编译器也通不过。问题出在哪呢?
#5
rjsp2023-07-06 23:39
估计你的Qt用的编译器太旧了,起码是十多年前的老古董。
我记得没错的话,现在Qt自带的是gcc/mingw 11.2(当然你也可以自己升为gcc/mingw 14)
你可以下载一个新的Qt,并是设置使用C++20标准(当然不设置也没关系,因为默认不会低于C++11)

delete的用法见
https://en.
#6
八画小子2023-07-07 00:49
程序代码:

    TransmitSignals(const TransmitSignals &) = delete ; ← //编译器报语法错误
    TransmitSignals(const TransmitSignals &&) = delete; ← //编译器报语法错误
    TransmitSignals &operator=(const TransmitSignals &) = delete;  ← //编译器报语法错误

这三行的写法,简单地说,就是。。。。。。貌似也不能简单地说啊。因为这得给你扯出类的构造函数的一大堆东西。
你这么问,应该是只是简单了解了一些C++的语法,但还没有正式接触C++的类这一部分,建议先大致看看这一部分。
报错,应该是和编译器遵循的C++版本有关。
这三行,简单而又不完全正确地意思就是:
1、这个类的对象,你不能通过已有对象来构造出一个新的对象。
2、这个类的对象,你不能通过移交所有权的方式,把一个对象转移给另一个对象。
3、这个类的对象,你不能通过赋值的方式,把一个对象赋值给另一个对象。

另外,第二行的
TransmitSignals(const TransmitSignals &&) = delete;
,有点问题,用&&的话,一般不会给参数带上const。

而人家用上
=delete
,意思就是:
1、禁止用已有对象来构造新对象
2、禁止移交所有权
3、禁止赋值。

[此贴子已经被作者于2023-7-7 00:51编辑过]

#7
forever742023-07-07 09:59
嗯,大概看懂了,就是旧版编译器不支持新标准的新语法。
旧版的教材自然也不会知道新版语法。
而在上来就学习的新标准的人士看来,接收和使用所有的语法,那是很自然的。

终身学习吧。
#8
weikong662023-07-07 11:46
回复 4楼 weikong66
我看明白了。就是delete有了新的用法标准。老的编译器跟我一样,也不明白delete的新用法。坦率地说,我的C++知识都是20多年前教科书的东西。谢了4楼的表述。看来我得更新我的delete用法的知识了。
#9
weikong662023-07-07 12:04
回复 5楼 rjsp
谢5楼,提供了delete用法链接。让我能更新我的delete用法知识。
1