标签: in-class-initialization

为什么在大括号初始化成员变量后需要另一组括号?

我试图使用大括号初始化(感谢Visual Studio 2013实际支持),但出于某种原因,当我在类上执行它时,它需要两组大括号.例如:

class NumberGrabber {
    int number;
public:
    NumberGrabber() : number{ 5 }{}

    int getNumber() { return number; }
};
Run Code Online (Sandbox Code Playgroud)

为什么要我说number { 5 }{}?这对我来说并没有真正的视觉感受.

c++ default-constructor in-class-initialization c++11

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

类初始化与构造函数初始化列表的顺序

我想在类中初始化一堆成员以保持源文件更清晰.但是,对象采用我只通过构造函数接收的参数,并且可以通过赋值在构造函数初始化列表或构造函数中初始化.(第二种选择肯定不会起作用.)这基本上是这样的情景:

在标题中

class Foo
{

public:
    Foo(Pointer * ptr);

private:

    Pointer * ptr;
    Member m1{ptr, "SomeText"};
    Member m2{ptr, "SomeOtherText"};
}
Run Code Online (Sandbox Code Playgroud)

在CPP

Foo::Foo(Pointer*ptr) : 
    ptr(ptr) 
{
    // ...
}   
Run Code Online (Sandbox Code Playgroud)

现在的问题是:标准是否说明了ptrm1/ 之间的初始化顺序m2.显然,这段代码只有在ptr之前m1和之前初始化时才有效m2.

c++ initialization operator-precedence initialization-list in-class-initialization

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

类内将不完整类型的 unique_ptr 初始化为 nullptr 时,gcc 编译错误

我正在使用 pimpl idiom 和 unique_ptr 编写一些代码。当我尝试使用类内初始化将 unique_ptr 默认设置为 nullptr 时,gcc 给出了编译错误,而 clang 和 msvc 都成功编译了代码。如果我没有使用类内初始化,错误就会消失。

\n\n
// A.h\n#pragma once\n\n#include <memory>\n\nusing namespace std;\n\nclass B;\nclass A\n{\nprivate:\n    ////////////////////////\n    // here gives the error!\n    ////////////////////////\n    unique_ptr<B> impl{nullptr}; // error only with gcc, \n                                 // ok with clang and msvc\n    unique_ptr<B> impl2; // ok with all three\n\npublic:\n    A();\n    ~A();\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n
// A.cpp\n#include "A.h"\n\nclass B\n{\nprivate:\n    int b{5};\n\npublic:\n    B() = default;\n    ~B() = default;\n};\n\nA::A() = default;\nA::~A() = default;\n
Run Code Online (Sandbox Code Playgroud)\n\n
// main.cpp\n#include "A.h"\n\nint main()\n{\n    A a;\n    return 0;\n}\n …
Run Code Online (Sandbox Code Playgroud)

c++ pimpl-idiom unique-ptr in-class-initialization gcc8

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

具有大小的向量的类内初始化

struct Uct
{
    std::vector<int> vec{10};
};
Run Code Online (Sandbox Code Playgroud)

上面的代码创建了包含值为 10 的单个元素的向量。但我需要用大小 10 来初始化该向量。像这样:

std::vector<int> vec(10);
Run Code Online (Sandbox Code Playgroud)

如何通过类内初始化来做到这一点?

c++ in-class-initialization braced-init-list

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

使用C++,我在创建类时获得带有0xcdcdcdcd的指针 - 发生了什么?

- - - - - - - - 编辑 - - - - - - - - - - - -

我抓住错误的值进行比较,cdcdcdcd来自其他地方.我仍然有我的方法在它们被触及之前抛出异常,但我的问题在于其他地方,我希望有一种方法可以"解开"我原来的问题.谢谢您的帮助.

- - - - - - - - 编辑 - - - - - - - - - - - -

我有一个类(MyClass)我从一些第三方类继承(反过来来自直接显示类 - 来自CBaseFilter,如果这很重要).我写这段代码:

MyClass* val = NULL;
val = new MyClass(); // Create an instance of the class.
Run Code Online (Sandbox Code Playgroud)

尝试进行方法调用会导致抛出异常.通过一点点调查,我发现当我取消引用val(val本身似乎有效......类似于0x0777fc90)时,它包含0xcdcdcdcd.我环顾四周,似乎这可能表明内存已经在堆上分配,但没有初始化.

那是什么意思?!如何调用new成功(val!= NULL)但是内存没有初始化到足以指向它的指针?某些基类初始化可能出现问题吗?如果是这样 - 我在寻找什么?

c++ memory initialization visual-c++ in-class-initialization

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

const 静态数据成员的初始值设定项是否被视为默认成员初始值设定项?

数据成员的初始值设定项是否const static被视为默认成员初始值设定项?

相关的写法是[class.mem.general]/10

大括号或等于初始化器只能出现在数据成员的声明中。(对于静态数据成员,请参阅 [class.static.data];对于非静态数据成员,请参阅 [class.base.init] 和 [dcl.init.aggr])。非静态数据成员的大括号或等于初始值设定项指定成员的默认成员初始值设定项[..]

例如:

constexpr int f() { return 0; }

struct A {
  static const int I = f();
};
Run Code Online (Sandbox Code Playgroud)

大括号或等于初始化器 是否f()被视为默认成员初始化器?

c++ static-members in-class-initialization

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