【问题标题】:How can I initialize an array of objects whose constructor require two or more arguments? [duplicate]如何初始化其构造函数需要两个或多个参数的对象数组? [复制]
【发布时间】:2012-03-11 16:11:02
【问题描述】:

建议我们有一个 A 类对象的数组,而 A 类的构造函数需要两个参数,如下所示:

class A  
{  
public:  
    A( int i, int j ) {}  
};  

int main()  
{
    const A a[3] = { /*How to initialize*/ };

    return 0;
}

如何初始化该数组?

【问题讨论】:

    标签: c++


    【解决方案1】:

    说:

    const A a[3] = { {0,0}, {1,1}, {2,2} };
    

    在较旧的编译器上,假设 A 具有可访问的复制构造函数,您必须说:

    const A a[3] = { A(0,0), A(1,1), A(2,2) };
    

    C++ 过去在数组方面相当不足(某些初始化根本不可能),而这在 C++11 中变得更好。

    【讨论】:

    • 在第一种情况下,编译器只是发出警告:'main.cpp:10:32: 警告:扩展初始化列表仅适用于 -std=c++0x 或 -std=gnu+ +0x [默认启用]。' “可访问”是什么意思?公开的?,谢谢。
    • @UniMouS:在 GCC 上,使用 -std=c++0x 编译。可访问意味着您可以访问它,即它不是私有的或=deleted。
    • 谢谢@Kerrek:=delete 是什么意思?
    【解决方案2】:

    只要该类型具有复制构造函数(无论是合成的还是显式定义的),以下工作:

    A array[] = { A(1, 3), A(3, 4), A(5, 6) };
    

    这适用于 C++2003 和 C++ 2011。KerrekSB 发布的解决方案当然不适用于 C++ 2003,但可能适用于 C++ 2011(我不确定它是否适用于那里)。

    【讨论】:

    • 复制构造函数也需要是可访问的。仅仅拥有一个是不够的。
    【解决方案3】:

    您可以提供一个默认构造函数并像往常一样初始化您的数组。初始化成功后,使用循环给每个成员重新赋值

    【讨论】:

      【解决方案4】:

      我觉得应该是这样的

      const A a[3] = { A(1, 2), A(3, 4), A(5, 6) };

      【讨论】:

      • 新的会让你指向 A,而不是 A 实例
      • 编译器发出错误:main.cpp:9:42: error: conversion from ‘A*’ to non-scalar type ‘A’ requested
      猜你喜欢
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      相关资源
      最近更新 更多