Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблемы с конструктором...


Автор: matrlx 31.5.2006, 04:13
 smile 
Ребята, помогите с вызовом конструктора с параметрами.
Есть класс Самолетов.
Я создаю массив классов строкой
типа AirPlanes air[10];

Но надо вызвать конструктор с параметрами ... т.е. 
в случае без массива надо написать AirPlanes air(parametrs);

Но в случае массива как написать надо?!
AirPlanes air[10](parametrs); не работает! smile 

Автор: Earnest 31.5.2006, 06:55
Нет такой синтаксической конструкции, которая позволяет объявить массив объектов, не имеющих конструктора по умолчанию, т.е. без параметров. 
Возможных выходов несколько:
1) Объявить в конструкторе значения параметров по-умолчанию, тогда именно они будут использованы при создании элементов массива:
Код

   class AirPlan
   {
   public:
       AirPlan (int a=1,double b=3.14) {/*... */ }
   };
   AirPlan a[100];   // будет создано 100 самолетов с параметрами a=1 и b = 3.14

2) Использовать не массив, а вектор (std::vector), тогда код может выглядеть следующим образом:
Код

   class AirPlan
   {
   public:
       AirPlan (int a,double b) {/*... */ }
   };
   std::vector<AirPlan> a(100,AirPlan(1,3.14));

3) Инициализация не в конструкторе, а в функции типа Init...

Наверное, есть и другие варианты. Не так давно в форуме уже обсуждался подобный вопрос, поищи.         

Автор: ptr 31.5.2006, 07:41
Или ещё можно AirPlan a[10]={ AirPlan(int, int),.....};  

Автор: Earnest 31.5.2006, 07:58
Да, так тоже можно, хотя не все компиляторы позволяют так написать для автоматического объекта. Кроме того, если самолоетов не 10, а 100 или 1000 ... копи-паст сломается раньше ... smile  

Автор: DeadSoul 31.5.2006, 12:07
 smile 
Цитата(Earnest @  31.5.2006,  07:58 Найти цитируемый пост)
Да, так тоже можно, хотя не все компиляторы позволяют так написать для автоматического объекта. Кроме того, если самолоетов не 10, а 100 или 1000 ... копи-паст сломается раньше ... 

На аутсорс индусам! 

Автор: likehood 31.5.2006, 13:58
Можно еще так (с помощью локального класса):
Код

struct A {
    A(int i): i(i) { };
    int i;
};

int main()
{
         // локальный класс не может работать со стековыми объектами, поэтому используем static
    static int init[10] = {1, 2, 3, 4, 5, 666, 7, 8, 9, 10};
    static int n = 0;
         // создаем локальный класс A_
    struct A_ : public A {
        A_() : A(init[n++]) { }
    };
    A_ arr[10]; // можно работать как с A arr[10];
    for (int i=0; i<10; i++)
        cout << arr[i].i << " ";
}
 

Автор: matrlx 31.5.2006, 14:37
Спасибо вам! smile  

Автор: SaDFromSpb 31.5.2006, 17:21
Earnest,  а что такое "автоматический объект"? 

Автор: likehood 31.5.2006, 17:49
Автоматический объект - иначе стековый объект - нестатический объект, создаваемый при вызове функции и уничтожаемый при выходе из нее. По-умолчанию все объекты в  функции и так являются автоматическими, хотя теоретически можно использовать ключевое слово auto. 

Автор: SaDFromSpb 31.5.2006, 19:07
baronp, то есть неавтоматические объекты - это те, о создании и удалении которых мы должны сами заботиться (располагающиеся в динамической памяти)?  

Автор: MAKCim 31.5.2006, 19:44
Цитата

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

вообщем да (кроме статических объектов - располагаются не в стеке, но заботиться об освобождении памяти не надо) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)