小编Uni*_*ant的帖子

静态const声明,constexpr变量定义,有效的c ++?

示例:在头文件中:

class Foo
{
     static const int IntArray[];                         
};
Run Code Online (Sandbox Code Playgroud)

在源文件中:

constexpr int Foo::IntArray[] = { 1, 2, 3, 4 };
Run Code Online (Sandbox Code Playgroud)

这在g ++上编译,允许我将初始化列表放在源文件中而不是标题中.(如果它是头文件中的constexpr,则编译器需要在头文件中立即初始化).虽然仍允许在constexpr评估中使用该数组......

这是有效的,可移植的C++吗?

c++

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

C++项目具有精心设计的异常机制

有没有人知道一个开源c ++应用程序与一个设计良好/强大的异常机制,所以我可以获得一些灵感?我看到的大多数代码/示例都有可疑的事情:

  1. 使用消息字符串作为参数抛出对象.似乎错了,因为它将异常标记为致命,可以向用户显示的错误消息更高,为客户端代码尝试处理异常留下了很小的空间.即使异常是致命的,像diffirent locales(语言)之类的东西也会让我在抛出点时格式化一条消息对我来说是一个坏主意.
  2. 使用从基本异常类派生的大量不同的异常类.为每一个可能出错的东西(打开文件,读取文件,写入文件,创建线程等)引入新的类/类型,感觉不对.使用基类型捕获最高级别的所有未处理异常会丢失显示有意义错误消息所需的类型信息.
  3. 对每个组件/库使用从基本异常类派生的一个异常类,并为其指定错误代码作为参数以指示确切的错误.使用基本类型捕获会导致模糊不清.(我们捕获了谁的错误代码"3"?)...

一些正确方向的指针将受到欢迎.

c++ exception

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

const重载而不必写两次函数

可能重复:
重复,常量和非常量,getter的优雅解决方案?

假设我有一个c ++类,其成员函数为const重载,如下所示:

        Type*  DoSomething();
const   Type*  DoSomething() const;
Run Code Online (Sandbox Code Playgroud)

如果这是一个更大,更复杂的成员,那么如何防止必须两次编写相同的代码?不能从const中调用任何非const函数.从非const中调用const版本会导致一个const指针必须被转换为非const(这有点像imo).

c++ overloading const

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

对象切片是否是一种可行的技术?

假设我有一个叫做的类AudioSample,实现不相关.AudioSamples可以从多个源加载,对于每个源,我从AudioSample派生一个类,为相关源添加相关的加载器代码.加载后,我通过将对象传递给AudioSample按值使用的函数来有目的地切片对象.

我似乎很好,它可以防止用各种加载函数污染基类,并防止我必须在必须添加新加载器时修改(经过试验和测试的)基类.

然而,当搜索stackoverflow进行对象切片时,我只找到将其描述为问题的答案并解释它的潜在缺陷,这让我想知道:我是否以某种方式使用它我不应该这样做?通过这样做我会遇到潜在的问题吗?我目前还没有意识到这一点?

c++

6
推荐指数
1
解决办法
284
查看次数

替代单身人士的独特资源

我一遍又一遍地阅读,应该避免因为各种原因使用单身人士.我想知道如何正确处理类表示唯一系统资源的情况.例如,使用SDL的AudioOutput类.由于SDL_OpenAudio一次只能打开一次,因此有多个这种类型的对象没有任何意义,而且在我看来,防止意外制造多于一个对象实际上是好的.

只是想知道经验丰富的程序员对此有何想法,我还缺少另一种选择吗?

singleton design-patterns global-variables

4
推荐指数
1
解决办法
371
查看次数

是否嵌套枚举类?

一个可以有独立的枚举类:

enum class StreamOpenMode
{
    read,
    write,
    readWrite
};

class Stream
{
public:

    Stream(StreamOpenMode openMode)
    //...
};
Run Code Online (Sandbox Code Playgroud)

或将它们嵌套在另一个类中:

class Stream
{
public:

    enum class OpenMode
    {
        read,
        write,
        readWrite
    };

    Stream(OpenMode openMode)
    //...
};
Run Code Online (Sandbox Code Playgroud)

选择一个而不是另一个的技术原因是什么?例如,不能预先声明嵌套的品种,这可能导致大型项目中的循环依赖问题。

c++ enums inner-classes

4
推荐指数
1
解决办法
77
查看次数

将对象移入std :: vector时的异常保证

如果在将对象移至std :: vector时内存分配失败,并且抛出bad_alloc,std :: vector是否保证从对象移出的对象不变/仍然有效?

例如:

std::string str = "Hello, World!";
std::vector<std::string> vec;

vec.emplace_back(std::move(str));
/* Is str still valid and unaltered if the previous line throws? */
Run Code Online (Sandbox Code Playgroud)

c++ stdvector exception-safety

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