2015-04-28 2 views
0

если есть один объект, мы можем инициализировать его с помощью конструктора следующим образом -как инициализировать «массив объекта» с конструктором аналогичным образом для «объекта»

class obj{ 
int x; 

public: 
obj(int n) {x=n;} 
}; 

int main() 
{ 
    obj p(2); 
} 

Есть ли точная тот же путь для массива объекта; и я имею в виду то же самое.

Я знаю о двух других способов инициализации объекта с конструктором -

obj p = obj(2); 
obj p = 2; // for one parameter constructor 

и есть эквивалентным образом инициализировать массив объекта -

obj p = {obj(1), obj(2), obj(3), obj(4)}; 
obj p[] = {1, 2, 3, 4}; 

, но я не смог найти подобный путь инициализирующий массив объекта, показанный в первом коде для одного объекта.

+0

кажется, что он работает нормально с obj p [] = {1, 2, 3, 4}; :/ –

+0

@NathanOliver [Нет] (http://coliru.stacked-crooked.com/a/9f0c7db5ebd609de) –

ответ

0

Если я правильно понял ваш вопрос права ...

// Initialize array member varible - method 1 
struct Foo 
{ 
    int a[3] = {1, 2, 3}; 
}; 

// Initialize array member varible - method 2 
struct Bar 
{ 
    Bar() : a{1, 2, 3} {} 
    int a[3]; 
}; 

// Can't do this. 
struct Foo 
{ 
    int a[] = {1, 2, 3}; 
}; 
+0

не понял второй способ. –

+0

Второй метод аналогичен инициализации элементов, которые не относятся к массиву типов. Если у вас есть член 'int b;', вы можете инициализировать его с помощью 'b {20}' в разделе инициализатора члена конструктора. –

+0

Я не знал, что структура имеет секцию конструктора:/и для чего нужен двоеточие? –

0

Это будет делать это:

#include <array> 
class obj{ 
    int x; 

public: 
    obj(int n) {x=n;} 
}; 

int main() 
{ 
    std::array<obj,3> p = {3, 7, 11}; 
} 

станд :: массив дает ту же семантику, как примитивный тип массива, а квалифицируется как C++ контейнер. Вы, вероятно, будет лучше использовать зЬй :: вектор, который предлагает возможность динамического изменения размеров и более высокий уровень защиты:

#include <vector> 
... 
std::vector<obj> p = {obj(1), obj(2), obj(4)}; 

Хорошая вещь об использовании общих контейнеров вы часто можете использовать их как взаимозаменяемые:

#include <vector> 
//#include <array> 
#include <algorithm> 
... 
int main() 
{ 
    std::vector<obj> p = {obj(1), obj(2), obj(4)};  
    // or the following: 
    // std::array<obj,3> p = {obj(1), obj(2), obj(4)}; 

    // either one of the above will work here 
    std::for_each(begin(p), end(p), 
       [](obj const & o){ std::cout << o.x << " "; }); 
       std::cout << std::endl; 
    //   ^^^ yes, this only works if x is public 
} 

Обратите внимание, что std :: array имеет размер во время компиляции, поэтому требуется, чтобы вы указали ему количество элементов.

Вы также можете переписать исходный класс использовать инициализатор список следующую конструкцию:

class obj{ 
    int x; 
public: 
    obj(int n) : x(n) { } 
}; 

Даже в этом примере это может помочь, потому что это позволяет сделать xconst. В общем, он имеет много преимуществ и является хорошей привычкой.

Смежные вопросы