想象一下,我有一个分配内存的类(暂时忘记智能指针):
class Foo
{
public:
Foo() : bar(new Bar)
{
}
~Foo()
{
delete bar;
}
void doSomething()
{
bar->doSomething();
}
private:
Bar* bar;
};
Run Code Online (Sandbox Code Playgroud)
除了在析构函数中删除对象之外,还值得将它们设置为NULL吗?
我假设在上面示例的析构函数中将指针设置为NULL是浪费时间.
使用C++命名空间时,您更喜欢显式命名它们,如下所示:
std::cout << "Hello, world!\n";
Run Code Online (Sandbox Code Playgroud)
或者您更喜欢using namespace:
using namespace std;
cout << "Hello, world!\n";
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢后者,您是否在文件或功能范围内声明您的使用?
我个人更喜欢明确地命名它们 - 它更多的是打字,但是当使用命名空间的混合(例如std和boost)时,我发现它更具可读性.
我注意到在使用MS Visual Studio 2008生成新的C++项目时,Release版本包含调试符号 - 特别是启用了以下设置:
我在Visual Studio的早期版本中从未注意到这一点.
因此,除了生成更大的EXE文件之外,启用这些设置是否有任何缺点?
当使用pImpl习语时,最好使用a boost:shared_ptr而不是std::auto_ptr?我确定我曾经读过增强版更加异常友好吗?
class Foo
{
public:
Foo();
private:
struct impl;
std::auto_ptr<impl> impl_;
};
class Foo
{
public:
Foo();
private:
struct impl;
boost::shared_ptr<impl> impl_;
};
Run Code Online (Sandbox Code Playgroud)
[编辑]使用std :: auto_ptr <>是否总是安全的,或者是否需要使用替代的boost智能指针?
向std命名空间添加类型是否可以接受.例如,我想要一个TCHAR友好的字符串,以下是可接受的吗?
#include <string>
namespace std
{
typedef basic_string<TCHAR> tstring;
}
Run Code Online (Sandbox Code Playgroud)
或者我应该使用自己的命名空间?
在回顾一些Qt C++代码时,我遇到了这个问题:
class Foo
{
Q_OBJECT
signals:
virtual void someSignal(const QString& str, int n)
{
Q_UNUSED(str);
Q_UNUSED(n);
}
...
};
Run Code Online (Sandbox Code Playgroud)
现在,Qt信号不能有一个身体所以我很惊讶这甚至编译(也许是因为身体实际上是空的).我也没有看到将信号虚拟为......它不能有一个身体所以它怎么能被覆盖?
我在这里遗漏了什么,或者这是一个有效的代码味道?
我正在组建一个构建系统,并想知道是否有一种可靠的方法来确定签出的SVN文件夹是否需要更新(即它是否与存储库不同步).除非发生变化,否则我想避免夜间建造.我可以编写一个脚本来解析svn update我猜的命令结果,但我想知道是否有一个命令可以告诉我实际上是否需要更新?
我正在使用一个使用'subdirs'模板的qmake .pro文件为我的Qt应用程序组建一个构建系统.这工作正常,并允许我指定每个目标的构建顺序,因此依赖关系很好地工作.不过,我现在已经添加了一个工具来生成一个版本号(包含它的制作日期,SVN版本等)所使用的主要的应用程序的项目 - 我可以先建这个版本的工具,但是当它是建立在我想在构建任何更多目标之前执行它(它生成一个包含主应用程序包含的版本号的头文件.)
例如,我的简单qmake文件看起来像这样:
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = version \
lib \
tests \
mainapp
Run Code Online (Sandbox Code Playgroud)
当'version'构建时,我想在构建'lib'之前执行它(在命令行上传递一些参数).
有谁知道这是否可能?我看到qmake有一个可以执行应用程序的"系统"命令,但我不知道如何利用它.
一个相关的问题涉及我的单元测试.它们存在于'test'项目中并使用QTest框架.我想在构建'mainapp'之前执行测试exe,如果测试失败(即测试exe没有返回零),我想退出构建过程.
我意识到qmake是为了生成makefile而设计的,所以我可能希望这里有点太多但是如果有人能给我一些指示,那将非常受欢迎.
我一直使用Visual Studio Dependencies选项来确保,例如,在构建我的C++项目时,还构建了任何依赖的LIB或DLL项目.然而,我一直听到人们提到'参考'并且想知道,随着VS 2010即将来临,我应该改变我的做法.
使用对依赖项的引用是否有任何好处,或者前者只是.NET功能?我目前正在使用VS2008.
我有一个Qt应用程序,它使用一个QMainWindow主要UI 的派生类.在启动时,我想进行一些安全检查,如果失败,则向用户显示一条消息并关闭主窗口.目前我在QMainWindow构造函数中进行了这些检查,但是如果我调用该close方法,则没有任何反应,应用程序继续运行.例如:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
setupUi(this);
...
if (checkFails())
{
QMessageBox::warning(this, tr("Error"), tr("You cannot run this app"));
// This has no effect
close();
}
}
Run Code Online (Sandbox Code Playgroud)
或者,我可以在main函数中进行检查,但后来我失去了显示特定于语言的消息框的能力(tr宏只能在QObject事物的外观中起作用.)
有关如何在启动时关闭主窗口或使tr宏在QObject派生类之外工作的任何想法?
c++ ×9
qt ×3
namespaces ×2
stl ×2
auto-ptr ×1
boost ×1
debugging ×1
qmake ×1
shared-ptr ×1
svn ×1
using ×1
visual-c++ ×1