小编Rob*_*Rob的帖子

C++单元测试框架

我为我的C++代码使用Boost Test框架,但它有两个问题,可能是所有C++测试框架都常见的:

  • 无法创建自动测试存根(例如,通过从所选类中提取公共函数).
  • 你不能运行一个测试 - 你必须运行整个'套件'测试(除非你创建了许多不同的测试项目).

有没有人知道更好的测试框架,还是我永远不会嫉妒Java/.NET开发人员可用的测试工具?

c++ unit-testing

61
推荐指数
6
解决办法
5万
查看次数

转发声明一个STL容器?

是否可以在头文件中转发声明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)

可以这样做吗?

c++ header c++-standard-library

47
推荐指数
3
解决办法
2万
查看次数

Qt GUI应用程序中的控制台输出?

我有一个在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++ windows qt qt4

47
推荐指数
5
解决办法
11万
查看次数

使用嵌套C++类和枚举的优缺点?

使用嵌套的公共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)

我可以看到嵌套私人枚举/课程的好处,但是当谈到公共场所/办公室时,办公室就分开了 - 它似乎更像是一种风格选择.

那么,你更喜欢哪个?为什么?

c++ enums nested class

44
推荐指数
2
解决办法
2万
查看次数

转义#define宏中的#符号?

在没有进入血腥细节的情况下,我想使用一个#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

我想我需要逃避#符号,但如果这是可能的话,我不会.

是的,宏确实很邪恶......

c c++ macros c-preprocessor preprocessor-directive

37
推荐指数
5
解决办法
3万
查看次数

在远程服务器上创建本地git存储库的副本

我已经从服务器克隆了一个项目git clone,我现在想将它(所有分支)复制到另一个服务器,以便其他人可以开始使用它.我想我可以简单地手动复制整个存储库,然后发出git config --bool core.bare true并删除除.git文件夹之外的所有内容,但我不认为它有资格作为'裸'存储库,我担心它可能会给我带来问题.

我希望我可以创建新的远程存储库git init --bare并简单地将我的本地存储库推送到它,但是当我最初从另一台服务器克隆我的本地副本时,origin似乎阻止了我这样做.

git

33
推荐指数
2
解决办法
2万
查看次数

嵌套的匿名命名空间?

使用匿名命名空间时,如果它嵌套在另一个命名空间中会有任何问题吗?例如,在以下代码中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++ namespaces

32
推荐指数
1
解决办法
7595
查看次数

这个C++结构初始化技巧是否安全?

我不是必须记住初始化一个简单的'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++ data-structures

31
推荐指数
4
解决办法
3万
查看次数

交换功能的好处?

浏览一些C++问题我经常看到一些STL友好类应该实现一个swap函数的评论(通常作为朋友.)有人可以解释一下它带来了什么好处,STL如何适应这个以及为什么这个函数应该实现为friend

c++ swap stl

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

'Helper'在C++中的功能

在重构一些旧代码时,我已经删除了一些实际上应该是静态的公共方法,因为它们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)

在大多数情况下,我认为我更喜欢命名空间方法,但我想知道每种方法的优缺点.例如,如果使用类方法,是否会有任何开销?

c++ namespaces class

28
推荐指数
3
解决办法
2万
查看次数