我正在使用Stroustrup的C++编程语言第4版进行练习.其中一项任务是这样制定的:
考虑使用类Exception作为用作异常的所有类的基础.它应该是什么样的?该如何使用?这有什么用呢?要求使用这样的课程可能会有什么缺点?
答案看起来很像std::exception
,除了缺点部分 - 我能想象的唯一一个__vptr
通常被认为可以忽略不计的成本.我在这里错过了什么?
我现在正在阅读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) 我想允许我的用户为各种操作分配自己的快捷方式.Qt为此目的提供了一个标准小部件QKeySequenceEdit
.不幸的是,这个小部件不检查它的输入是否重复,并且很高兴接受甚至标准组合等Ctrl+C
.我想做的是:
QKeySequenceEdit::editingFinished()
,创建快捷方式并以某种方式触发它以观察QShortcut::activatedAmbiguously()
信号.但是,似乎无法以编程方式触发快捷方式.当然可以通过向操作系统提供关键序列并让它回放来检查模糊激活,但它看起来相当牵强.有更好的想法吗?
在 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)
并公开继承它的所有内容,但它打开了一个完全不同的虚拟继承蠕虫罐头。还有更好的想法吗?
考虑这样的事情:
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还是应该通过引用将它作为输出参数传递?
我有一个QSplitter
带有两个子QWidget
对象的水平对象。现在,当用户将拆分器手柄向右拖动超过某个阈值(我假设这取决于孩子的最小尺寸)时,右侧会立即QWidget
消失。setSizePolicy
,setMinimumSize
没有帮助。
此外,hideEvent
没有触发,我什至无法检测到我的小部件何时被隐藏。我尝试使用resizeEvent
,但它的新旧宽度参数似乎都有未记录的奇怪值——有时是 0,有时是 -1。即使有一个系统,它也可以随着下一个 Qt 版本而改变。
理想情况下,我想完全关闭这种消失的行为。作为妥协,我会很感激如何检测它的想法。
我的宠物项目已经到了我应该开始跟踪指针寿命的地步,我正在尝试为其开发一些系统。遗憾的是,流行的到处使用智能指针的建议并不适用,因为 Qt API 本身在任何情况下都使用裸指针。所以,我想到的是:
对于 Qt 拥有的一切,
QPointer
,在转换为裸之前进行isNull()
检查。对于我完全拥有的所有东西,请按照建议使用智能指针。我将使用std::
这里的版本。
令我烦恼的案子。对于切换所有权的对象(例如从布局中添加/删除的小部件)
delete
在适当的时候手动进行。建议、意见、建议?我自己不太喜欢这个方案。
试图先问问官方的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++ ×8
qt ×5
base-class ×1
debugging ×1
dynamic-cast ×1
inheritance ×1
nrvo ×1
pointers ×1
qpointer ×1
qsplitter ×1
qt-creator ×1
rvo ×1
siblings ×1