2016-07-28 26 views
5

Örneğin (ı bir derleme zamanı çözüm bulmaya çalışıyorum), aşağıdaki C++ sınıf var: Tek bir nesneyi istersenizC++ nesneler örnekleme dizisi

struct A { 
    A(const int value) {} 
}; 

, ben bunu yapabilirsiniz:

A a = A(3); 

Bu nesnelerin 10'unu oluşturmak isterim, statik olarak nasıl örnek oluşturacağımı bilmiyorum.

A a[10]; // This won't compile, as struct A constructor needs an argument 

Ben bir işaretçi A *a kullanın ve ardından nesneyi tek tek oluşturmak, ama yeni özellik ben statik 1 çekimde bu yapabilirim sağlayan C++11 mevcut olduğunu olmadığından emin değilim ki?

cevap

7

Liste başlatma Eğer

A a[10]{0,1,2,3,4,5,6,7,8,9}; 

A 'ın yapıcı geçilecek Listedeki her eleman yazmasına olanak tanır.

Live demo

-1

Eğer A tüm örneklerini aynı parametreyi kullanmak istiyorsanız, aşağıdaki gibi bir destek işlevi kullanabilirsiniz:

#include <array> 
#include <cstddef> 
#include <functional> 
#include <cassert> 

struct A { 
    A(int value): v{value} { } 

    template<std::size_t... I> 
    static A* create(std::index_sequence<I...>, int val) { 
     return new A[sizeof...(I)]{ (I, val)... }; 
    } 

    template<std::size_t N> 
    static A* create(int val) { 
     return create(std::make_index_sequence<N>(), val); 
    } 

    int v; 
}; 

int main() { 
    A *arr = A::create<10>(42); 
    for(int i = 0; i < 10; i++) assert(arr[i].v == 42); 
    delete[] arr; 
} 

temel fikir oluşturduğu izin vermektir örneklerinin A örneklerinden oluşan yeni bir dizi ve tüm yapıları için aynı parametre val kullanın.

NOT

std::make_index_sequence ve std::index_sequence revizyon C++ 14 beri oyunun parçasıdır. Eğer bunları kullanamıyorsanız, çevrimiçi olarak yukarıda gösterilen hemen hemen aynı kodu kullanmanıza yardımcı olacak bir C++ 11 uygulaması bulabilirsiniz:

+0

@downvoters Bu, minimum, çalışan bir çözümdür. takdir. En azından bakış açınızdan neyin yanlış olduğunu anlamaya yardımcı olur ... Teşekkürler. – skypjack