2012-02-14 109 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