2012-02-14 63 views
3

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

# 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; 
    } 

这是行得通的,但有没有其他方式比这更好?

+1

为什么C'S'malloc'和'残培()'而不是C++的'new'并使用iostream? – Cameron 2012-02-14 18:24:13

+0

“*这是工作*”不,它不;它调用UB并且只有_appears_才能工作。 – ildjarn 2012-02-14 19:42:30

+0

@ildjarn你是什么意思,它只调用UB?我没有明白UB的意思。 – Invictus 2012-02-14 19:45:18

回答

4

C++的方式将是使用一个std ::向量。

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

创建了由1初始化10 A的。

+0

这需要A(int)不是显式的,我认为? – 2012-02-14 18:24:59

+0

可能,但它不在示例中。 – 2012-02-14 18:25:49

+0

当然,想要确定,因为我想回答同样的事情,但认为可能有些坏事:) – 2012-02-14 18:27:51

0

这是通过使用标准::矢量构造器服用的尺寸和底座元件解决:

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

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

如果你真的必须使用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; 
    } 
} 
+0

我不希望'A(int)构造函数抛出或默认的拷贝构造函数 – 2012-02-14 18:35:30

+0

@BoPersson:true,但是当他再次用'std :: string'来做这件事时,他惊讶于他的程序崩溃了?我会教普通的正确(并且简单!办法。 – 2012-02-14 18:38:26

+0

“*,我很确定它是未定义的行为*”它绝对是。 – ildjarn 2012-02-14 19:44:06

相关问题