标签: initialization-list

将'this'对象传递给初始化列表

我已将问题简化为以下示例代码:

class Charizard { //truck
    trainer &myTrainer;
  public:
    Charizard(trainer &tMyTrainer);
};

class trainer {
    Charizard myPokemon;
  public:
    trainer();
};

Charizard::Charizard(trainer &tMyTrainer) : myTrainer(tMyTrainer) {}
Run Code Online (Sandbox Code Playgroud)

在不更改或添加公共成员的情况下,如何为培训师创建构造函数,以便在初始化列表中创建myPokemon时,"myTrainer"指向正在创建的培训师?

这是我尝试过的:

trainer::trainer() : myPokemon(this) {}
Run Code Online (Sandbox Code Playgroud)

但当然"这个"不是正确的类型.我无法改变Charizard构造函数所采用的内容(它是一个公共成员),所以我不知道该怎么做.有任何想法吗?

注意:标题可能需要一些工作.

c++ constructor reference initialization-list

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

C++继承的模板类和初始化列表

我一直在将一些数学类转换为模板并使用初始化列表,并在继承的类需要在初始化时访问基类数据成员时遇到问题.

这是代码:

template <typename T>
struct xCoord2
{
    T x;
    T y;

    xCoord2(T _x, T _y) : x(_x), y(_y) {};
};

template <typename T>
struct xCoord3 : xCoord2<T>
{
    typedef xCoord2<T> B;

    T z;

    // All Error
    xCoord3(T _x, T _y, T _z) : x(_x), y(_y), z(_z) {};
    xCoord3(T _x, T _y, T _z) : B::x(_x), B::y(_y), z(_z) {};
    xCoord3(T _x, T _y, T _z) : this->x(_x), this->y(_y), z(_z) {};

    // Works
    xCoord3(T _x, T _y, T _z) { B::x …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance templates initialization-list

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

在默认构造函数中明确设置初始化列表是有优点还是缺点?

显式为C++对象构造函数提供FULL初始化列表是否有任何优点或缺点?(尽管我们只是使用默认构造函数,但是你已经列出了所有成员的全部内容?)

例如,如果我有对象:

class MyObject
{
    public: 
        MyObject();
    private:
        double _doub;
        Foo _foo;
        std::set<int> _intSet;
        int _int;
        Bar _bar;
}
Run Code Online (Sandbox Code Playgroud)

与我的构造函数是否有任何区别:

MyObject::MyObject():
    _doub(1.4), _foo("me"), _intSet(),
    _int(5), _bar() {};
Run Code Online (Sandbox Code Playgroud)

与仅列出我特别需要设置数据的对象(或调用非默认构造函数):

MyObject::MyObject():
    _doub(1.4), _foo("me"), _int(5) {};
Run Code Online (Sandbox Code Playgroud)

如果Class只有它使用默认构造函数的对象,我是否应该设置初始化列表?

例如:

class MyObject
{
    public: 
        MyObject();

    private:
        Foo _foo;
        std::set<int> _intSet;
        Bar _bar;
}
Run Code Online (Sandbox Code Playgroud)

是否有一个像这样的构造函数?

MyObject::MyObject():
    _foo(), _intSet(), _bar() {};
Run Code Online (Sandbox Code Playgroud)

谢谢.

c++ initialization-list

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

是否有办法警告行为不端的指定初始化器?

C99引入了结构指定的初始化器的概念.例如,给定:

typedef struct {
    int c;
    char a;
    float b;
} X;
Run Code Online (Sandbox Code Playgroud)

我可以初始化为:X foo = {.a = '\1', .b = 2.0F, .c = 4};并且调用:printf("c = %d\na = %hhu\nb = %f", foo.c, foo.a, foo.b);将输出:

c = 4
a = 1
b = 2.000000

这里提到这有分配给的"令人惊讶的行为" c,然后ab独立我指定的初始的顺序.

如果我有这样的函数,这将成为一个真正的问题:

int i = 0;

int f() {
    return ++i;
}

int g() {
    i += 2;
    return i;
}

int h() {
    i += 4; …
Run Code Online (Sandbox Code Playgroud)

c warnings designated-initializer initialization-list

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

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

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

在标题中

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
查看次数

无论如何要在初始化列表之前调用 CoInitialize() 吗?

这是我的 ThorDetectorSwitch.cpp 文件构造函数的 C++ 代码:

ThorDetectorSwitch::ThorDetectorSwitch() : _mcSwitch(__uuidof(MCLControlClass))
{
    _A  = WstringToBSTR(L"A"); 
    _B  = WstringToBSTR(L"B");
    _C  = WstringToBSTR(L"C");
    _D  = WstringToBSTR(L"D");

    _deviceDetected = FALSE;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,初始化列表_mcSwitch(__uuidof(MCLControlClass))用于初始化 COM 对象(MCLControlClass,从 COM dll 注册)。

我想知道我是否可以在此初始化列表之前调用 CoInitialize() ?因为我收到“CoInitialize() 尚未被调用”的异常。或者有其他方法可以避免这种异常吗?

多谢。

c++ com constructor initialization-list

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

使用C++类中的复杂函数初始化const成员

我有一个与3d网格一起使用的程序.这个网格有自己的类对象Grid,看起来像这样(简化版):

class Grid
{
  public:
    Grid() { readDataFromInputFile(); }
  private:
    void readDataFromInputFile() {...} // this function reads the values for i, j, k from disk
    int i; int j; int k;
};
Run Code Online (Sandbox Code Playgroud)

我现在想做的是能够将变量i,j和k设置为const int,以避免在其他函数中意外地搞乱它们.但是我不能在成员初始化列表中轻松设置它们,因为它们必须从文件中读取.我一直在浏览现有的讨论,但我找不到关于这个问题的准确讨论.

有没有一个解决方案能够将它们设置为const,并且仍然能够使用复杂的函数来检索数据?在我的实际应用程序中,当然还有更多要读取的变量,初始化后不允许更改.

c++ class initialization-list

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

构造函数初始化列表中使用的变量的顺序是否重要?

考虑下面的课程

class A 
{
int a;
double b;
float c;
A():a(1),c(2),b(3)
{}
}
Run Code Online (Sandbox Code Playgroud)

我们是否必须按照我们在类中声明的顺序使用初始化列表中的变量?初始化列表中的变量顺序是否会对该类/变量的内存分配产生影响?(考虑一下场景,如果类有很多bool变量,很多双变量等等.)

c++ memory constructor initialization-list

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

初始化列表后的大括号

class Foo
{
    Foo(double InitValue): StoredDouble(InitValue)
    {
    }

    double StoredDouble;
}
Run Code Online (Sandbox Code Playgroud)

是否有一种语法可以让我在初始化列表后跳过花括号?我知道这是一件小事,但我想在我的代码中尽可能简洁.

c++ syntax initialization-list

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

子类成员变量作为初始化列表中的主类构造函数的参数= crash?

编程非常新,所以请原谅我可能没有看到明显的东西.

基本上我只是想知道为什么所有三个代码都编译,但是在TWO和THREE情况下产生的可执行文件CRASH(我用注释标记了差异)

ONE - 编译

#include <iostream>
#include <string>
using namespace std;

string testrace = "dog"; //defining it only globally

class Attributes {
    public:
    Attributes (string race){
        if (race == "human"){
            intelligence = 10;}
        else if (race == "dog"){
            intelligence = 4;}
    }
    int intelligence;
};

class Dalmatian: public Attributes{
    public:
        // but NOT locally
        Dalmatian (): Attributes{testrace} { //using it as an argument
            cout << "do i even arrive here" << endl;
        }
};

int main() {
    Dalmatian bob; …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance initialization-list

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