首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在构造函数的成员初始值设定项列表中使用带有指示器的初始值设定项列表初始化匿名联合类型时出现编译错误

。这个错误通常发生在C++中,当我们试图在联合类型的构造函数中使用带有指示器的初始值设定项列表来初始化匿名联合类型的成员时。

首先,让我们来了解一下构造函数、成员初始值设定项列表、匿名联合类型的概念。

构造函数是一种特殊的成员函数,用于创建和初始化对象。它具有与类名相同的名称,没有返回类型,并且在对象创建时自动调用。

成员初始值设定项列表是构造函数的一部分,它位于构造函数的定义中,并用于初始化类的成员变量。成员初始值设定项列表使用冒号(:)后跟一系列以逗号分隔的初始值设定项来指定每个成员的初始值。

匿名联合类型是指在结构体或类中声明的没有标识符的联合类型。它可以作为结构体或类的成员存在,并与其他成员共享内存。

现在回到问题本身,出现编译错误的原因是因为在匿名联合类型的构造函数中,我们无法直接使用带有指示器的初始值设定项列表来初始化匿名联合类型的成员。指示器通常用于指示联合类型中哪个成员是活跃的。

为了解决这个问题,我们可以通过以下方式来初始化匿名联合类型的成员:

  1. 在构造函数体中使用赋值操作符来初始化匿名联合类型的成员。

例如,假设我们有一个类MyClass,其中包含一个匿名联合类型union作为成员:

代码语言:txt
复制
class MyClass {
public:
    MyClass(int a, int b, int c) : unionMember(a) {
        unionMember.b = b;
        unionMember.c = c;
    }

private:
    union {
        int a;
        int b;
        int c;
    } unionMember;
};

在上面的例子中,我们在构造函数的成员初始值设定项列表中使用了指示器unionMember(a)来初始化匿名联合类型的成员a,并在构造函数体中通过赋值操作符分别为bc成员赋值。

  1. 如果希望在成员初始值设定项列表中初始化匿名联合类型的成员,可以创建一个临时的匿名联合类型对象,然后将其赋值给成员。

例如:

代码语言:txt
复制
class MyClass {
public:
    MyClass(int a, int b, int c) : unionMember({a}) {
        unionMember = {b}; // 通过赋值操作符将b赋值给unionMember
        unionMember = {c}; // 通过赋值操作符将c赋值给unionMember
    }

private:
    union {
        int a;
        int b;
        int c;
    } unionMember;
};

在上面的例子中,我们首先通过unionMember({a})来创建一个临时的匿名联合类型对象,并将其赋值给成员a。然后,我们可以使用赋值操作符unionMember = {b}unionMember = {c}bc的值分别赋值给匿名联合类型的成员。

总结起来,在构造函数的成员初始值设定项列表中,如果想要初始化匿名联合类型的成员,可以使用赋值操作符或创建临时的匿名联合类型对象并进行赋值操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C#3.0新增功能06 对象和集合初始值设定项

使用 C# 可以在单条语句中实例化对象或集合并执行成员分配。 对象初始值设定项 使用对象初始值设定项,你可以在创建对象时向对象的任何可访问字段或属性分配值,而无需调用后跟赋值语句行的构造函数。...利用对象初始值设定项语法,你可为构造函数指定参数或忽略参数(以及括号语法)。 以下示例演示如何使用具有命名类型 Cat 的对象初始值设定项以及如何调用无参数构造函数。...查询表达式常使用只能通过使用对象初始值设定项进行初始化的匿名类型,如下面的声明所示。...select new {p.ProductName, Price = p.UnitPrice}; 集合初始值设定项 在初始化实现 IEnumerable 的集合类型和初始化使用适当的签名作为实例方法或扩展方法的...Add 方法的一个对象,它使用在列表中每项具有多个元素的集合初始值设定项,这些元素对应于 Add 方法的签名。

89410

C#构造函数的作用_以下程序段的作用是inta

构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化 (1)构造函数的名字必须与类同名; (2)构造函数没有返回类型,它可以带参数,也可以不带参数; (3)构造函数的主要作用是完成对类的初始化工作...; (4)在创建一个类的新对象(使用new关键字)时,系统会自动调用给类的构造函数初始化新对象; C#的类有两种构造函数:实例构造函数和静态构造函数 实例构造函数:负责初始化类中的实例变量,...它只有在用户用new关键字为对象分配内存时才被调用,而且作为引用类型的类,其实例化后的对象必然时分配在托管堆(Managed Heap)上。...如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行.任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项; ...(6)如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数; 一个类可以同时拥有实例构造函数和静态构造函数,这是惟一可以具有相同参数列表的同名方法共存的情况

66610
  • C#3.0新增功能02 匿名类型

    可通过使用 new 运算符和对象初始值创建匿名类型。 有关对象初始值设定项的详细信息,请参阅对象和集合初始值设定项。...包含其他种类的类成员(如方法或事件)为无效。 用来初始化属性的表达式不能为 null、匿名函数或指针类型。 最常见的方案是用其他类型的属性初始化匿名类型。...匿名类型声明以 new 关键字开始。 声明初始化了一个只使用 Product 的两个属性的新类型。 这将导致在查询中返回较少数量的数据。...如果你没有在匿名类型中指定成员名称,编译器会为匿名类型成员指定与用于初始化这些成员的属性相同的名称。 必须为使用表达式初始化的属性提供名称,如下面的示例所示。...无法将字段、属性、时间或方法的返回类型声明为具有匿名类型。 同样,你不能将方法、属性、构造函数或索引器的形参声明为具有匿名类型。

    88620

    C#3.0新增功能09 LINQ 基础08 支持 LINQ 的 C# 功能

    隐式类型化变量 (var) 可以使用 var 修饰符来指示编译器推断并分配类型,而不必在声明并初始化变量时显式指定类型,如下所示: var number = 5; var name = "Virginia...对象和集合初始值设定项 通过对象和集合初始值设定项,初始化对象时无需为对象显式调用构造函数。 初始值设定项通常用在将源数据投影到新数据类型的查询表达式中。...(y => new Customer { Name = y.Name, Phone = y.Phone }); 匿名类型 匿名类型由编译器构造,且类型名称只可用于编译器。...匿名类型提供一种在查询结果中对一组属性临时分组的简便方法,无需定义单独的命名类型。...使用新的表达式和对象初始值设定项初始化匿名类型,如下所示: select new {name = cust.Name, phone = cust.Phone}; 有关详细信息,请参阅匿名类型。

    1.9K30

    【Golang】快速复习指南QuickReview(六)——struct

    构造函数 struct有默认无参构造函数,不能再显式定义这个无参构造函数,编译器始终会生成一个默认的构造器 结构不能包含显式的无参数构造函数,默认构造器会把所有字段的自动初始化 public struct...{ Lon = lon; Lat = lat; } //结构中不能实例属性或字段初始值设定项...Lon = lon; } //结构中不能实例属性或字段初始值设定项 //public double Lon { get; set; }=5.5; public...使用 ref 返回值按引用返回方法结果。在Golang中也会存在这个问题,下一节会提到。 Golang的结构体struct 1....此时,没有指定初始值的字段的值就是该字段类型的零值。这点跟C#存在有参构造函数的结构是不一致。

    54530

    C#7.3 新增功能

    1.3 stackalloc 数组支持初始值设定项 当你对数组中的元素的值进行初始值设定时,你已能够指定该值: var arr = new int[3] {1, 2, 3}; var arr2 = new...2.4 扩展初始值设定项中的表达式变量 已对在 C# 7.0 中添加的允许 out 变量声明的语法进行了扩展,以包含字段初始值设定项、属性初始值设定项、构造函数初始值设定项和查询子句。...此版本添加了三个新规则,以帮助编译器选取明显的选择: 当方法组同时包含实例和静态成员时,如果方法在不含实例接收器或上下文的情况下被调用,则编译器将丢弃实例成员。...如果方法在含有实例接收器的情况下被调用,则编译器将丢弃静态成员。 在没有接收器时,编译器将仅添加静态上下文中的静态成员,否则,将同时添加静态成员和实例成员。...静态上下文(其中隐式 this 实例接收器无法使用)包含未定义 this 的成员的正文(例如,静态成员),以及不能使用 this 的位置(例如,字段初始值设定项和构造函数初始值设定项)。

    1.7K10

    C语言与C++面试知识总结

    ,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。...联合有如下特点: 默认访问控制符为 public 可以含有构造函数、析构函数 不能含有引用类型的成员 不能继承自其他类,不能作为基类 不能含有虚函数 匿名 union 在定义所在作用域可直接访问 union...成员初始化列表 好处 更高效:少了一次调用默认构造函数的过程。...有些场合必须要用初始化列表: 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面 没有默认构造函数的类类型...,因为使用初始化列表可以不必调用默认构造函数来初始化 initializer_list 列表初始化 用花括号初始化器列表初始化一个对象,其中对应构造函数接受一个 std::initializer_list

    5K41

    什么?CC++面试过不了?因为你还没看过这个!

    ,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。...联合有如下特点: 默认访问控制符为 public 可以含有构造函数、析构函数 不能含有引用类型的成员 不能继承自其他类,不能作为基类 不能含有虚函数 匿名 union 在定义所在作用域可直接访问 union...成员初始化列表 好处 更高效:少了一次调用默认构造函数的过程。...有些场合必须要用初始化列表: 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面 没有默认构造函数的类类型...,因为使用初始化列表可以不必调用默认构造函数来初始化 initializer_list 列表初始化 用花括号初始化器列表初始化一个对象,其中对应构造函数接受一个 std::initializer_list

    3.7K50

    C# 发展历史及版本新功能介绍

    在某一分部定义中声明的任何类、结构或接口成员可供所有其他部分使用。 最终类型是所有部分在编译时的组合。 备注 partial 修饰符不可用于委托或枚举声明中。...可通过使用 new 运算符和对象初始值创建匿名类型。 有关对象初始值设定项的详细信息,请参阅对象和集合初始值设定项。...这两种技术都可与方法、索引器、构造函数和委托一起使用。 使用命名参数和可选参数时,将按实参出现在实参列表(而不是形参列表)中的顺序计算这些实参。...在 C# 4.0 版中引入 dynamic 关键字让用户可以替代编译时类型上的编译器。 通过使用 dynamic 关键字,可以创建和动态类型语言(例如 JavaScript)类似的构造。...以下介绍了部分功能: 静态导入 异常筛选器 属性初始值设定项 Expression bodied 成员 Null 传播器 字符串内插 nameof 运算符 字典初始值设定项 这些功能每一个都很有趣。

    4.2K20

    类和对象(下篇)

    再谈构造函数 构造函数体赋值 在之前的学习中我们知道,在创建一个对象时,我们的编译器就会自动调用构造函数将对象初始化,给对象中各个成员变量一个合适的初始值。...,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。...(初始化只能初始化一次) 类中包含以下成员,必须放在初始化列表位置进行初始化: 1 引用成员变量 2 const成员变量 3 自定义类型成员(且该类没有默认构造函数时) 直接上代码: 可以看到,...这段代码中A类中并没有无参或者全缺省的构造函数,所以没有默认构造函数,必须使用列表初始化 而int& ref则是引用变量 _a 的类型时const int 他们都必须使用列表初始化 所以这段代码中的...(所以在之后的代码中我们初始化时可以尽量地去使用列表初始化) 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关 下面看一段代码: 大家可以来思考一下结果 class

    7710

    C#6.0 新增功能

    属性只能在构造函数的主体中设置; 尝试在另一种普通方法中设置 LastName 会生成 CS0200 编译错误: ?...此功能实现用于创建不可变类型的真正语言支持且使用更简洁和方便的自动属性语法。 02 自动属性初始化表达式 自动属性初始值设定项可让你在属性声明中声明自动属性的初始值。...鉴于此行为,建议仔细编写 catch 和 finally 子句,避免引入新的异常。 10 使用索引器初始化关联集合 索引初始值设定项是提高集合初始值设定项与索引用途一致性的两个功能之一。...11 集合初始值设定项中的扩展 Add 方法 使集合初始化更容易的另一个功能是对 Add 方法使用扩展方法。 添加此功能的目的是进行 Visual Basic 的奇偶校验。...如果自定义集合类的方法具有通过语义方式添加新项的名称,则此功能非常有用。 12 改进了重载解析 在以前的一些构造中,以前版本的 C# 编译器可能会发现涉及 lambda 表达式的一些方法不明确。

    1.7K20

    【C++】构造函数初始化列表 ① ( 类对象作为成员变量时的构造函数问题 | 构造函数初始化列表语法规则 )

    一、类对象作为成员变量时的构造函数问题 1、问题描述 如果 一个类 A 的对象 作为 另外一个类 B 的成员变量时 , 在以下场景会报错 : 为类 A 定义 有参的 构造函数 , 那么 A 的无参默认构造函数就失效了...; 此时使用 默认无参构造函数 初始化 B , 就会报错 ; 在一个类中 , 其成员变量是 带有参构造函数 的类型 , 这种情况下没有调用 有参构造函数的机会 , 此时就会出现 编译报错情况 ; 在下面的代码中...是一种用于初始化类的成员变量的方法 ; 构造函数初始化列表 可实现功能 : 为成员变量提供初始值 调用其他 成员变量的 构造函数 来初始化成员变量 构造函数初始化列表语法规则 : 构造函数() : 成员变量名称...(成员变量值) , 成员变量名称(成员变量值) { // 构造函数内容 } 构造函数初始化列表 位置在 构造函数 的 参数列表之后 , 冒号 : 与花括号 {} 之间 ; 使用 逗号 , 分隔 ;...初始化列表中的元素由 成员变量的名称 和 初始值组成 , 使用等号 = 连接 ; 在下面的代码中 , 为 B 类定义了默认的构造函数 , 其中定义了 构造函数 初始化列表 ; 在 初始化列表中 , m_age

    67630

    第7章 类

    合成的默认构造函数可能执行错误的操作。当默认初始化类的内置类型的数据成员时,如果在类内没有初始值,则执行默认初始化后这些成员变量的值是未定义的。...C++11新标准中,可以通过在参数列表后面写上=default来要求编译器生成默认构造函数。 当某个数据成员被构造函数初始值列表忽略时,它将以与合成默认构造函数相同的方式隐式初始化。...所以如果此时内置类型的数据成员没有使用类内初始化,也被初始列表忽略时,该对象在使用该构造函数构造后,这些成员变量将会是未初始化的。...注意,上述查找过程只适用于成员函数定义时出现的名字,而函数声明时,返回类型或参数列表中使用的名字(通常是类型别名),都必须在使用前确保可见。...构造函数初始值列表只说明用于初始化成员的值,而不限定成员的初始化顺序。成员的初始化顺序与它们在类定义中的出现顺序一致。下面的代码中看似会先初始化 j,再初始化 i。实则不然。

    84940

    类和对象(完结)

    对于没有显⽰在初始化列表初始化的⾃定义类型成员会调⽤这个成员类型的默认构造函数,如果没有默认构造会编译错误。...(4)引⽤成员变量,const成员变量,没有默认构造的类类型变量必须在初始化链表初始化 4总结 • 之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅ 式,就是初始化列表...• 每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义 初始化的地⽅。...对于没有 显⽰在初始化列表初始化的⾃定义类型成员会调⽤这个成员类型的默认构造函数,如果没有默认构 造会编译错误。...• 初始化列表中按照成员变量在类中声明顺序进⾏初始化,跟成员在初始化列表出现的的先后顺序⽆ 关。建议声明顺序和初始化列表顺序保持⼀致。

    9910

    C# 9.0 中的新增功能

    模块初始值设定项 分部方法的新功能 .NET 5 支持 C# 9.0。...以前,.NET 类型主要分为引用类型(包括类和匿名类型)和值类型(包括结构和元组)。 虽然建议使用不可变的值类型,但可变的值类型通常不会引入错误。...属性初始值设定项可明确哪个值正在设置哪个属性。 缺点是这些属性必须是可设置的。 从 C# 9.0 开始,可为属性和索引器创建 init 访问器,而不是 set 访问器。...调用方可使用属性初始化表达式语法在创建表达式中设置这些值,但构造完成后,这些属性将变为只读。 仅限 init 的资源库提供了一个窗口用来更改状态。 构造阶段结束时,该窗口关闭。...如果编译器在多个源文件中找到顶级语句,则是错误的。 如果将顶级语句与声明的程序入口点方法(通常为 Main 方法)结合使用,也会出现错误。

    1.7K20

    【C++】类和对象(下):再探构造函数、类型转换、static成员、友元、内部类、匿名对象、拷贝对象时编译器的优化

    1.再探构造函数         之前我们实现构造函数时,初始化成员变量主要是使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表。...初始化列表的使用方式:冒号开始,逗号分隔数据成员列表,每个成员变量后面跟一个放在括号里的初始值或者表达式。...const成员变量,引用成员变量,没有默认构造的类类型变量,必须在初始化列表位置进行初始化,否则会编译报错。 先说const成员变量和引用成员变量为什么必须在初始化列表进行初始化。...{} 所以当类类型变量有默认构造函数时,在初始化列表可写可不写,没有默认构造函数时,必须在初始化列表进行初始化。...初始化列表中按照成员变量在类中声明顺序进行初始化,先声明先初始化,跟成员在初始化列表出现的先后顺序无关。建议声明顺序和初始化列表顺序保持一致。

    9710

    类和对象(3)

    因为初始化只能初始化一次,而构造函数体内可以多次赋值。 初始化列表 以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。...每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 2....类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时) 3.尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量...4.成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关 下面这段代码: 尽管初始化列表尝试首先初始化_a1然后初始化_a2,但实际的初始化顺序是由成员变量在类定义中的声明顺序决定的...在_a2初始化时,_a1是未定义的(即处于未初始化状态),但C++标准并不要求在这种情况下编译器产生错误或警告。

    6110

    类和对象(下)

    构造函数 构造函数关于初始化列表方面 初始化列表的语法: 初始化列表的语法位于构造函数的参数列表和函数体之间,使用 : 来分隔。...成员变量走初始化列表的逻辑: 显式在初始化列表中初始化的成员变量: 如果你在构造函数的初始化列表中明确地为成员变量指定了初始值,那么这些成员变量将按照提供的值进行初始化。...: 如果某些成员变量没有显式在初始化列表中进行初始化,它们的初始化依赖于其声明类型: 类中声明位置有缺省值: 如果类内给成员变量提供了默认初始值,那么这些变量将使用该缺省值来初始化 class...MyClass { public: int x = 10; // 类中声明的缺省值 MyClass() { // 构造函数中没有初始化列表,x 将会使用 10 作为初始值...必须初始化列表的情况:const、引用类型成员变量,以及没有默认构造函数的成员变量必须使用初始化列表初始化。

    7410

    探索C++的奥秘之类和对象(下)

    再谈构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值 一个类要初始化成员变量有两种方式,第一种方式叫做函数体赋值,还有一种叫做初始化列表 class...因为初始化只能初始化一次,而构造函数体内可以多次赋值。  1.2 初始化列表 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。...初始化列表是成员定义的地方,构造函数是对每个成员进行初始化,不叫作定义。 注意: 1. 每个成员变量在初始化列表中最多只能出现一次,不出现也是可以的(初始化只能初始化一次) 2....类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时) class A { public:     //A(int a...尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。 4.

    3100

    【C++修行之道】类和对象(六)再谈构造函数(初始化列表)| explicit关键字 | static成员 | 友元|匿名对象|拷贝时一些编译器优化

    每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 3. 类中包含以下成员,必须放在初始化列表位置进行初始化: 声明给缺省值也可以是其他的值 4. 尽量使用初始化列表初始化。 5....: 6.3 优化总结 七、 再次理解类和对象 一、再谈构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。...每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 3..../ 自定义类型的成员会调用默认构造 // 内置类型有缺省值用缺省值,没有就看编译器,有的会处理,有的不会处理 // 先走初始化列表 + 再走函数体 // 实践中:尽可能使用初始化列表初始化,不方便再使用函数体初始化...它允许在需要类类型对象的地方使用构造函数的参数类型值,编译器会自动调用这个构造函数进行类型转换。 class A { public: // 1.

    14710
    领券