Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt5如何使类成员小部件可以';不能删除_C++_Qt5 - Fatal编程技术网

C++ Qt5如何使类成员小部件可以';不能删除

C++ Qt5如何使类成员小部件可以';不能删除,c++,qt5,C++,Qt5,我正在构建一个类似于浏览器标签的QTabWidget,它包含一个QToolButton来添加标签 演示图片在这里 我将此按钮设置为私有成员QToolButton*addTabButton并在公共方法QToolButton*addTabBtn()上初始化 我想要什么 我的想法是让api用户选择使用newTab按钮(调用tabWidget.addTabBtn()),并自定义自己的按钮。但我不希望api用户在调用后删除它 问题 当我这样做时,我发现有问题: tabwidget = new Brow

我正在构建一个类似于浏览器标签的QTabWidget,它包含一个QToolButton来添加标签

演示图片在这里

我将此按钮设置为私有成员
QToolButton*addTabButton
并在公共方法
QToolButton*addTabBtn()
上初始化

我想要什么

我的想法是让api用户选择使用newTab按钮(调用
tabWidget.addTabBtn()
),并自定义自己的按钮。但我不希望api用户在调用后删除它


问题

当我这样做时,我发现有问题:

tabwidget = new BrowserTab(this);
tabwidget->addTab(new QLabel("some content",tabwidget),
                  QString("Loooooooooooooooooong Title"));
tabwidget->addTabBtn();
/* connect signal/slot to button... */

/*Error usage*/
QToolButton *button = tabwidget->addTabBtn();
delete button;
这是导致分段错误的原因。是否有任何技术可以防止用户在初始化按钮后删除按钮? 可能返回按钮的引用


PS: 我的英语很有限,不便之处,敬请原谅


其他信息:

操作系统:Win7 32位
QT套件:桌面Qt5.11.1 MinGw 32位
回购:

但我不希望api用户在调用后删除它

这很简单:通过将析构函数设为私有来隐藏它,并让类与删除它所需的任何代码交朋友。是的,您必须从类派生,而切片成为一个问题。一般来说,你可以让你的用户不做某事:C++不是设计来在API提供者和API消费者之间安装安全屏障的:API消费者可以做任何他们想做的事情,只要他们知道他们在做什么。
在Qt中,通常情况下,除非API特别提到
QObject
指针传递所有权,否则您得到的任何对象指针通常都不是您可以删除的。

@eyllanesc引用不会更改任何内容-它可以再次转换为指针。这充其量只是一个不这样做的暗示。另一个提示应该在文档中提及。如果有人真的想删除他不应该删除的内容,那么很难阻止-接受根本不返回指针。完全安全的滥用是很难在C++中实现的。太棒了!谢谢你的帮助!我缺乏软件设计经验。
tabwidget = new BrowserTab(this);
tabwidget->addTab(new QLabel("some content",tabwidget),
                  QString("Loooooooooooooooooong Title"));
tabwidget->addTabBtn();
/* connect signal/slot to button... */

/*Error usage*/
QToolButton *button = tabwidget->addTabBtn();
delete button;