【问题标题】:How to initialize an array of objects of a parameterized constructor如何初始化参数化构造函数的对象数组
【发布时间】:2012-02-14 18:18:50
【问题描述】:

我需要初始化一个参数化构造函数的对象数组。我怎样才能以最好的方式做到这一点?

   # include<iostream>
   # include<conio.h>
   # include<stdio.h>

   using namespace std;

   class A
   {
    public:
    int a;       
    A();
    A(int x)
    {
     a=x;
    }      
   };
   int main()
   {
    A *a1,a2(1);
    a1 = (A*)malloc(sizeof(A)*10); // equivalent to A[10]. 
    for(int i=0;i<10;i++) a1[i]=a2; // Initialization is important in any program.
    for(int i=0;i<10;i++) cout<<a1[i].a; 
    getch(); 
    return 0;   
   }

这确实有效,但还有其他更好的方法吗?

【问题讨论】:

  • 为什么使用 C 的 mallocgetch() 而不是 C++ 的 new 并使用 iostream?
  • "这确实有效" 不,它没有;它调用 UB 并且只有 出现 可以工作。
  • @ildjarn 它只调用 UB 是什么意思?我没听懂你说的 UB 是什么意思?
  • @Ritesh : Undefined Behavior

标签: c++ c++11


【解决方案1】:

C++ 方法是使用 std::vector。

std::vector<A>   a1(10, 1);

创建 10 个由 1 初始化的 A

【讨论】:

  • 我认为这要求 A(int) 不明确?
  • 可能,但示例中没有。
  • 当然,想确定一下,因为我想回答同样的问题,但认为可能有问题:)
  • 当向量超出范围时(在 main 的末尾),它会自行销毁。或者,如果您想提前清空它,可以调用 clear。
  • @Ritesh - 你不能只声明一个析构函数,你还必须定义它。但是上面的类不需要一个。
【解决方案2】:

这可以使用 std::vector 构造函数来解决,该构造函数采用大小和基本元素:

A a2(1);
std::vector<A> tab(10, a2);

【讨论】:

    【解决方案3】:

    注意malloc 不构造对象,因此调用a1[i]=a2 是错误的形式。它可能似乎工作正常,因为它们是 POD 式对象,但这不是执行 C++ 的正确方法。这是未定义的行为,完全不可预测。它可能会连续运行一万次,然后擦除您的银行帐户。您应该使用 new 代替,它 also 构造。或者更好的是,使用向量,就像其他答案所暗示的那样。另外,请确保默认构造函数初始化数据,初始化将不那么担心。

    如果你真的必须使用malloc,那么初始化的“正确方法”是这样的:

    std::uninitialized_copy(a1, a1+10, a2); //constructs and assigns
    

    大致相当于:

    {
        int i=0;
        try {
            for(i=0; i<10; ++i)
               new(a1+i)A(a2); //constructs and initializes in the buffer
        } catch(...) { 
            try {
                for(; i>=0; --i)
                   (a1+i)->~A(); //destroy if an error occured
            } catch(...) { 
                std::terminate();
            }
            throw;
        }
    }
    

    【讨论】:

    • 我不希望 A(int) 构造函数抛出。或者默认的复制构造函数。
    • @BoPersson:是的,但是当他用std::string 再次这样做时,他对他的程序崩溃感到惊讶?我将教授通用正确(且简单!)的方法。
    • "我很确定这是未定义的行为" 绝对是。
    • @ildjarn:我不是 100% 确定,因为 POD 的定义已经改变,而且 POD 是一些相关规则的例外。
    • @MooingDuck +1 For Genric 正确的方式:)
    猜你喜欢
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多