小编sig*_*gil的帖子

为所有异常设置一个基类有什么缺点?

我正在使用Stroustrup的C++编程语言第4版进行练习.其中一项任务是这样制定的:

考虑使用类Exception作为用作异常的所有类的基础.它应该是什么样的?该如何使用?这有什么用呢?要求使用这样的课程可能会有什么缺点?

答案看起来很像std::exception,除了缺点部分 - 我能想象的唯一一个__vptr通常被认为可以忽略不计的成本.我在这里错过了什么?

c++ exception-handling base-class

8
推荐指数
1
解决办法
252
查看次数

什么是dynamic_cast兄弟姐妹的用例?

我现在正在阅读Scott Meyers的"更有效的C++".启发性!第2项提到dynamic_cast不仅可以用于downcast,也可以用于兄弟演员.可以请任何人为兄弟姐妹提供一个(合理的)非人为的例子吗?这个愚蠢的测试打印0应该是,但我无法想象任何这种转换的应用程序.

#include <iostream>
using namespace std;

class B {
public:
    virtual ~B() {}
};

class D1 : public B {};

class D2 : public B {};

int main() {
    B* pb = new D1;
    D2* pd2 = dynamic_cast<D2*>(pb);
    cout << pd2 << endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ inheritance dynamic-cast siblings

7
推荐指数
1
解决办法
529
查看次数

如何在Qt应用程序中检查重复项的快捷方式?

我想允许我的用户为各种操作分配自己的快捷方式.Qt为此目的提供了一个标准小部件QKeySequenceEdit.不幸的是,这个小部件不检查它的输入是否重复,并且很高兴接受甚至标准组合等Ctrl+C.我想做的是:

  • 理想情况下,获取我的应用程序中活动的所有快捷方式的列表及其翻译提示.我不认为这是可能的.
  • 理想情况下,连接到QKeySequenceEdit::editingFinished(),创建快捷方式并以某种方式触发它以观察QShortcut::activatedAmbiguously()信号.但是,似乎无法以编程方式触发快捷方式.

当然可以通过向操作系统提供关键序列并让它回放来检查模糊激活,但它看起来相当牵强.有更好的想法吗?

c++ qt keyboard-shortcuts

6
推荐指数
0
解决办法
218
查看次数

如何跟踪计划稍后删除的对象?

在 Qt 中经常建议使用它deleteLater()来代替普通的delete。然而,它会导致悬空对象的问题:它们被标记为删除,但仍然出现在 Qt API 返回的子列表中。(由于这种行为严重违反直觉,我快速发展的 Qt 怪癖让我验证了这一点。他们确实这样做了。) 那么,是否有一种惯用的方法来跟踪此类对象?当然,我可以使用临时解决方案,例如

class DeleteLaterable
{
public:
     void markForDeletion() { mMarked = true; }
     bool isMarked() const { return mMarked; }
private:
     bool mMarked = false;
};
Run Code Online (Sandbox Code Playgroud)

并公开继承它的所有内容,但它打开了一个完全不同的虚拟继承蠕虫罐头。还有更好的想法吗?

c++ qt

5
推荐指数
1
解决办法
1149
查看次数

对于复杂的返回类型,我可以依赖命名返回值优化吗?

考虑这样的事情:

typedef std::unordered_multiset<int> Set;
typedef std::set<Set> SetOfSets;

SetOfSets somethingRecursive(SomeType somethingToAnalyze) {
    Set s;
    // ...
    // check base cases, reduce somethingToAnalyze, fill in s
    // ...
    SetOfSets ss = somethingRecursive(somethingToAnalyze);
    ss.insert(s);
    return ss;
}
Run Code Online (Sandbox Code Playgroud)

这种方法对于生成子集、排列等问题来说是相当标准的。 但是,我尝试制作一个图表,说明返回值优化应该在这里优化什么,因为该类型的内部数据结构相当复杂(std::unordered_multiset是一个哈希表,并且std::set通常是' 一个二叉搜索树),好吧,我只能希望编译器比我更聪明。

那么,谈论性能和(如果重要的话)C++14,我可以在SetOfSets这里返回 a还是应该通过引用将它作为输出参数传递?

c++ rvo nrvo

5
推荐指数
1
解决办法
1312
查看次数

如何防止 QSplitter 完全隐藏子小部件?

我有一个QSplitter带有两个子QWidget对象的水平对象。现在,当用户将拆分器手柄向右拖动超过某个阈值(我假设这取决于孩子的最小尺寸)时,右侧会立即QWidget消失。setSizePolicysetMinimumSize没有帮助。

此外,hideEvent没有触发,我什至无法检测到我的小部件何时被隐藏。我尝试使用resizeEvent,但它的新旧宽度参数似乎都有未记录的奇怪值——有时是 0,有时是 -1。即使有一个系统,它也可以随着下一个 Qt 版本而改变。

理想情况下,我想完全关闭这种消失的行为。作为妥协,我会很感激如何检测它的想法。

c++ qt qsplitter

3
推荐指数
1
解决办法
1940
查看次数

我应该如何在 Qt 中存储指针?

我的宠物项目已经到了我应该开始跟踪指针寿命的地步,我正在尝试为其开发一些系统。遗憾的是,流行的到处使用智能指针的建议并不适用,因为 Qt API 本身在任何情况下都使用裸指针。所以,我想到的是:

  1. 对于 Qt 拥有的一切,

    • 本地使用裸指针;
    • 也可以在函数之间传递它们;
    • 将它们存储为子类QPointer,在转换为裸之前进行isNull()检查。
  2. 对于我完全拥有的所有东西,请按照建议使用智能指针。我将使用std::这里的版本。

  3. 令我烦恼的案子。对于切换所有权的对象(例如从布局中添加/删除的小部件)

    • 裸露地使用、存储、传递指针;
    • delete在适当的时候手动进行。

建议、意见、建议?我自己不太喜欢这个方案。

c++ qt pointers qpointer

3
推荐指数
1
解决办法
1776
查看次数

Qt调试器控制台看不到调试会话

试图先问问官方的Qt论坛,但无济于事。

Qt Creator 4.2.0(社区),Windows 7 SP1,MSVC 2013 64位。尝试调试预安装的示例项目。调试会话正在运行,断点有效,变量值已更新,但是无论我在调试会话中键入什么内容,“调试器控制台”窗口始终显示“只能在调试会话期间求值”。任何想法如何解决这个问题?

更新:编译输出如下。

21:51:30: Running steps for project svgviewer...
21:51:30: Configuration unchanged, skipping qmake step.
21:51:30: Starting: "C:\Qt\Qt5.7.1\Tools\QtCreator\bin\jom.exe" 
    C:\Qt\Qt5.7.1\Tools\QtCreator\bin\jom.exe -f Makefile.Debug
cl -c -nologo -Zc:wchar_t -FS -Zi -MDd -GR -W3 -w34100 -w34189 -w44996 -EHsc /Fddebug\svgviewer.vc.pdb -DUNICODE -DWIN32 -DWIN64 -DQT_QML_DEBUG -DQT_SVG_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I..\svgviewer -I. -I..\..\..\..\5.7\msvc2013_64\include -I..\..\..\..\5.7\msvc2013_64\include\QtSvg -I..\..\..\..\5.7\msvc2013_64\include\QtOpenGL -I..\..\..\..\5.7\msvc2013_64\include\QtWidgets -I..\..\..\..\5.7\msvc2013_64\include\QtGui -I..\..\..\..\5.7\msvc2013_64\include\QtANGLE -I..\..\..\..\5.7\msvc2013_64\include\QtCore -Idebug -I..\..\..\..\5.7\msvc2013_64\mkspecs\win32-msvc2013 -Fodebug\ @C:\Users\msl\AppData\Local\Temp\main.obj.7392.31.jom
main.cpp
C:\Qt\Qt5.7.1\5.7\msvc2013_64\bin\rcc.exe -name svgviewer ..\svgviewer\svgviewer.qrc -o debug\qrc_svgviewer.cpp
C:\Qt\Qt5.7.1\5.7\msvc2013_64\bin\moc.exe -DUNICODE -DWIN32 -DWIN64 -DQT_QML_DEBUG -DQT_SVG_LIB -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB …
Run Code Online (Sandbox Code Playgroud)

c++ debugging qt qt-creator

2
推荐指数
1
解决办法
2337
查看次数