我为我的C++代码使用Boost Test框架,但它有两个问题,可能是所有C++测试框架都常见的:
有没有人知道更好的测试框架,还是我永远不会嫉妒Java/.NET开发人员可用的测试工具?
是否可以在头文件中转发声明STL容器?例如,请使用以下代码:
#include <vector>
class Foo
{
private:
std::vector<int> container_;
...
};
Run Code Online (Sandbox Code Playgroud)
我希望能够做到这样的事情:
namespace std
{
template <typename T> class vector;
}
class Foo
{
private:
std::vector<int> container_;
...
};
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?
我有一个在Windows上运行的Qt GUI应用程序,它允许传递命令行选项,在某些情况下我想向控制台输出一条消息,然后退出,例如:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if (someCommandLineParam)
{
std::cout << "Hello, world!";
return 0;
}
MainWindow w;
w.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
但是,当我从命令提示符运行应用程序时,不会显示控制台消息.有谁知道我怎么能让这个工作?
使用嵌套的公共C++类和枚举的优点和缺点是什么?例如,假设您有一个名为的类printer
,并且此类还存储有关输出托盘的信息,您可以:
class printer
{
public:
std::string name_;
enum TYPE
{
TYPE_LOCAL,
TYPE_NETWORK,
};
class output_tray
{
...
};
...
};
printer prn;
printer::TYPE type;
printer::output_tray tray;
Run Code Online (Sandbox Code Playgroud)
或者:
class printer
{
public:
std::string name_;
...
};
enum PRINTER_TYPE
{
PRINTER_TYPE_LOCAL,
PRINTER_TYPE_NETWORK,
};
class output_tray
{
...
};
printer prn;
PRINTER_TYPE type;
output_tray tray;
Run Code Online (Sandbox Code Playgroud)
我可以看到嵌套私人枚举/课程的好处,但是当谈到公共场所/办公室时,办公室就分开了 - 它似乎更像是一种风格选择.
那么,你更喜欢哪个?为什么?
在没有进入血腥细节的情况下,我想使用一个#define
扩展为a 的宏,#include
但是'#'符号会混淆预处理器(因为它认为我想引用一个参数.)
例如,我想做这样的事情:
#define MACRO(name) #include "name##foo"
Run Code Online (Sandbox Code Playgroud)
并使用它:
MACRO(Test)
Run Code Online (Sandbox Code Playgroud)
这将扩展到:
#include "Testfoo"
Run Code Online (Sandbox Code Playgroud)
简单的#符号导致预处理器进入barf.MinGW给我以下错误:
'#' is not followed by a macro parameter
我想我需要逃避#符号,但如果这是可能的话,我不会.
是的,宏确实很邪恶......
我已经从服务器克隆了一个项目git clone
,我现在想将它(所有分支)复制到另一个服务器,以便其他人可以开始使用它.我想我可以简单地手动复制整个存储库,然后发出git config --bool core.bare true
并删除除.git
文件夹之外的所有内容,但我不认为它有资格作为'裸'存储库,我担心它可能会给我带来问题.
我希望我可以创建新的远程存储库git init --bare
并简单地将我的本地存储库推送到它,但是当我最初从另一台服务器克隆我的本地副本时,origin
似乎阻止了我这样做.
使用匿名命名空间时,如果它嵌套在另一个命名空间中会有任何问题吗?例如,在以下代码中Foo1.cpp和Foo2.cpp之间是否存在任何真正的区别:
// Foo.h
namespace Foo
{
void fooFunc();
}
// Foo1.cpp
namespace Foo
{
namespace
{
void privateFunction()
{
...
}
}
void fooFunc()
{
privateFunction();
}
}
// Foo2.cpp
namespace
{
void privateFunction()
{
...
}
}
namespace Foo
{
void fooFunc()
{
privateFunction();
}
}
Run Code Online (Sandbox Code Playgroud) 我不是必须记住初始化一个简单的'C'结构,而是可以从它派生并在构造函数中将它归零,如下所示:
struct MY_STRUCT
{
int n1;
int n2;
};
class CMyStruct : public MY_STRUCT
{
public:
CMyStruct()
{
memset(this, 0, sizeof(MY_STRUCT));
}
};
Run Code Online (Sandbox Code Playgroud)
这个技巧通常用于初始化Win32结构,有时可以设置无处不在的cbSize成员.
现在,只要memset调用没有虚函数表来销毁,这是一种安全的做法吗?
浏览一些C++问题我经常看到一些STL友好类应该实现一个swap
函数的评论(通常作为朋友.)有人可以解释一下它带来了什么好处,STL如何适应这个以及为什么这个函数应该实现为friend
?
在重构一些旧代码时,我已经删除了一些实际上应该是静态的公共方法,因为它们a)不对任何成员数据进行操作或调用任何其他成员函数和b)因为它们可能在其他地方证明是有用的.
这让我想到了将"帮助"功能组合在一起的最佳方法.Java/C#方式是将一类静态函数与私有构造函数一起使用,例如:
class Helper
{
private:
Helper() { }
public:
static int HelperFunc1();
static int HelperFunc2();
};
Run Code Online (Sandbox Code Playgroud)
但是,作为C++,您还可以使用命名空间:
namespace Helper
{
int HelperFunc1();
int HelperFunc2();
}
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,我认为我更喜欢命名空间方法,但我想知道每种方法的优缺点.例如,如果使用类方法,是否会有任何开销?