| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 656 人关注过本帖
标题:delete用在赋值语句中,有这种用法吗?
只看楼主 加入收藏
weikong66
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2023-7-6
结帖率:0
收藏
 问题点数:0 回复次数:8 
delete用在赋值语句中,有这种用法吗?
有人编写了一个类,其中有下面3条语句:
    TransmitSignals(const TransmitSignals &) = delete ;
    TransmitSignals(const TransmitSignals &&) = delete;
    TransmitSignals &operator=(const TransmitSignals &) = delete;
我使用了这个类。在编译时这3条语句出错。我也感觉delete的这种用法没见过。请问哪位高手能说明一下该delete的用法对不对?
搜索更多相关主题的帖子: delete 用法 语句 const 赋值 
2023-07-06 14:12
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1685
专家分:4252
注 册:2007-12-27
收藏
得分:0 
看起来不是C,尽管我不懂,但是我建议楼主,到合适的板块,说清是什么语言,什么开发环境,编译时出什么错,截个图啥的。
然后也许没准儿还需要进一步了解前置声明什么的。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2023-07-06 15:10
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
首先,给楼主说一下,你来错地方了,这属于C++的范畴,而非C语言。
其次,既然你问道了,就顺便给说一下,= delete表示告诉编译器该类无对应的构造函数。
最后,顺便给你也说一下,和=delete对应的还有=default。这个的意思是说让编译器自动生成对应的构造函数,作为程序员的你,不必要写这些函数。
最后的最后,给你说一下,个人建议最好用=delete,而不是无=delete或用=default,除非你确定会发生什么。
2023-07-06 15:20
weikong66
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2023-7-6
收藏
得分:0 
回复 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个复制构造函数和一个操作符重载函数上,究尽要表达一个什么意义?而且这种表达编译器也通不过。问题出在哪呢?
2023-07-06 22:54
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
估计你的Qt用的编译器太旧了,起码是十多年前的老古董。
我记得没错的话,现在Qt自带的是gcc/mingw 11.2(当然你也可以自己升为gcc/mingw 14)
你可以下载一个新的Qt,并是设置使用C++20标准(当然不设置也没关系,因为默认不会低于C++11)

delete的用法见
https://en.
2023-07-06 23:39
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
程序代码:
    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编辑过]

2023-07-07 00:49
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1685
专家分:4252
注 册:2007-12-27
收藏
得分:0 
嗯,大概看懂了,就是旧版编译器不支持新标准的新语法。
旧版的教材自然也不会知道新版语法。
而在上来就学习的新标准的人士看来,接收和使用所有的语法,那是很自然的。

终身学习吧。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2023-07-07 09:59
weikong66
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2023-7-6
收藏
得分:0 
回复 4楼 weikong66
我看明白了。就是delete有了新的用法标准。老的编译器跟我一样,也不明白delete的新用法。坦率地说,我的C++知识都是20多年前教科书的东西。谢了4楼的表述。看来我得更新我的delete用法的知识了。
2023-07-07 11:46
weikong66
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2023-7-6
收藏
得分:0 
回复 5楼 rjsp
谢5楼,提供了delete用法链接。让我能更新我的delete用法知识。
2023-07-07 12:04
快速回复:delete用在赋值语句中,有这种用法吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018166 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved