33197


C++初心者です。  
とあるサイトで下のようなポリモーフィズムのサンプルコードが有りまして、  
（クラスは省略しています）

[code]

    int main() {
        Animal* theArray[5];
    
        theArray[0] = new Dog;
        theArray[1] = new Cat;
        theArray[2] = new Horse;
        theArray[3] = new Pig;
        theArray[4] = new Animal;
    
        for (int i = 0; i < 5; i++) {
            theArray[i]->Speak();
        }
    }
    
[/code]

このサンプルはdeleteしていないのでメモリーリークがありまして、  
コードの下に  
delete theArray[0];  
delete theArray[1];  
delete theArray[2];  
delete theArray[3];  
delete theArray[4];  
を追加することで収まりましたが、面倒なのでスマートポインタがいいのではないかと思いまして、  
下のように書きましたが、エラーで動きません。

[code]

    int main() {
        unique_ptr<Animal[]> theArray = make_unique<Animal[]>(5);
    
        theArray[0] = make_unique<Dog>();
        theArray[1] = make_unique<Cat>();
        theArray[2] = make_unique<Horse>();
        theArray[3] = make_unique<Pig>();
        theArray[4] = make_unique<Animal>();
    
        for (int i = 0; i < 5; i++) {
            theArray[i]->Speak();
        }
    }
    
[/code]

unique_ptr配列にオブジェクトを入れる方法をはありますでしょうか？

ちなみに、vectorだったら下のようにしてうまくいきました。

[code]

    int main() {
        vector<unique_ptr<Animal>> theArray;
    
        theArray.emplace_back(make_unique<Dog>());
        theArray.emplace_back(make_unique<Cat>());
        theArray.emplace_back(make_unique<Horse>());
        theArray.emplace_back(make_unique<Pig>());
        theArray.emplace_back(make_unique<Animal>());
    
        for (int i = 0; i < 5; i++){
            theArray[i]->Speak();
        }
    }
    
[/code]


CC BY-SA 3.0
2017-03-08T20:57:42.273
33196
2017-03-08T22:18:46.083
20982
question
c++
unique_ptr配列にオブジェクトを入れる方法


`theArray`は、要素が`unique_ptr`で、それ自身も動的に確保しているので`unique_ptr`ということで、

[code]

    unique_ptr<unique_ptr<Animal>[]> theArray = make_unique<unique_ptr<Animal>[]>(5);
    
[/code]

と定義する必要があります。`unique_ptr<Animal>[]`は、要素の型が
`unique_ptr<Animal>`である配列を表しています。それで`unique_ptr<unique_ptr<Animal>[]>`は、全体として`unique_ptr<Animal>`を要素に持つ配列を指す`unique_ptr`ということになります。

これでも問題はないと思いますが、私だったら、配列のサイズが実行時にならないと分からないときは、例に挙げられているように`std::vector`を、コンパイル時にサイズが分かっているなら`std::array`か普通の配列を使います。個人的には、`std::vector`と同じように使える`std::array`の方が、普通の配列より好みです。

### std::array の場合

[code]

    #include <array>
    // 省略
    
    int main() {
        std::array<std::unique_ptr<Animal>, 5> theArray;
    
        theArray[0] = std::make_unique<Dog>();
        // 省略
    
[/code]

### 普通の配列の場合

[code]

    // 省略
    
    int main() {
        std::unique_ptr<Animal> theArray[5];
    
        theArray[0] = std::make_unique<Dog>();
        // 省略
    
[/code]


CC BY-SA 3.0
2017-03-08T22:05:36.367
33197
2017-03-08T22:18:46.083
2020-06-17T08:14:45.997
-1
3605
33196
answer