Иницмализация массива в конструкторе
От: MikelSV http://www.centerix.ru
Дата: 10.08.11 20:08
Оценка:
Хочу инициализировать массив в конструкторе.

class TestBContX{ public:
    int d[4];
    TestBContX() : d(1, 2, 3, 4) {    }
};



1. Не работает.
2. А должно ли работать? [ну, я пробовал и другие варианты, но они тоже не работали.]

Мне нужно создать список элементов и хранить его в классе. type d[]={1, 2, 3}; самый лучший вариант, который сам выберет размер и вставит элементы в массив.

Хм, думаю можно решить мою проблему через:

class TestBContX{ public:
    int d[4];
    TestBContX(){ int a[]={1, 2, 3, 4}; memcpy(d, a, sizeof(a)); }
};


Но может быть все же есть вариант с инициализацией в конструкторе?
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re: Иницмализация массива в конструкторе
От: Vamp Россия  
Дата: 10.08.11 20:23
Оценка: 1 (1)
Здравствуйте, MikelSV, Вы писали:

MSV>Хочу инициализировать массив в конструкторе.

Не получится.

MSV>1. Не работает.

И не будет.

MSV>2. А должно ли работать? [ну, я пробовал и другие варианты, но они тоже не работали.]

Наверное, должно — это было бы мило со стороны компилятора. Но работать не будет.

MSV>Мне нужно создать список элементов и хранить его в классе. type d[]={1, 2, 3}; самый лучший вариант, который сам выберет размер и вставит элементы в массив.

А зачем тебе массив, если ты хочешь списка? Используй std::list или std::deque.

MSV>Хм, думаю можно решить мою проблему через:

Это решение корявое. Есть вот такое, но тоже не особо:

class TestBContX{ public:
    std::vector<int> d;
    TestBContX() :  { 
        int arr[] = {1, 2, 3, 4};
        const size_t arr_size = sizeof(arr) / sizeof(arr[0]);
        d.resize(arr_size);
        std::copy(arr, arr + arr_size, d.begin()); 
    }
};


MSV>Но может быть все же есть вариант с инициализацией в конструкторе?

Нету.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Иницмализация массива в конструкторе
От: MikelSV http://www.centerix.ru
Дата: 10.08.11 20:31
Оценка:
Здравствуйте, Vamp, Вы писали:

Эм, знаете, я не люблю std, поэтому не знаю, как добрыми словами спросить, зачем тут vector? ой, от list производительность сгорит в агонии.
Я хочу именно массив. Определенной длинны с определенными данными, которые будут шустро использоваться. А эти извращения нужны по причине того, что таких классов может быть много и с разным количеством элементов в массиве, иначе проще вбить руками.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re[3]: Иницмализация массива в конструкторе
От: Vamp Россия  
Дата: 10.08.11 20:43
Оценка: 1 (1)
MSV>Эм, знаете, я не люблю std,
Печально. Я полагаю, что ты умеешь его готовить.

MSV>поэтому не знаю, как добрыми словами спросить, зачем тут vector?

Затем, что вектор, как правило, удобнее встроенного массива.

MSV>ой, от list производительность сгорит в агонии.

Зависит от сценария использования, мне он не известен.

MSV>Я хочу именно массив. Определенной длинны с определенными данными, которые будут шустро использоваться.

Вектор удовлетворяет этим требованиям.

А синтаксис для инициализации массива в конструкторе в С++ отсутствует.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Иницмализация массива в конструкторе
От: MikelSV http://www.centerix.ru
Дата: 11.08.11 05:11
Оценка: -2
Я верю, что вектор это хорошо, но моя параноя советует не использовать экскаватор для рытья маленькой ямки под цветочки. На тему логичности и простоты она вообще молчит. И прозрачности кода тоже.
Подключение stl к программе это событие, как праздник. Не хочу себя так радовать.
Римское правило. Тот, кто говорит, что Это не может быть сделано, никогда не должен мешать тому, кто Это делает.
Осень, ну вы поняли.
Зачем еще один код? А человек?
Re: Иницмализация массива в конструкторе
От: LaptevVV Россия  
Дата: 11.08.11 05:29
Оценка: +1
Здравствуйте, MikelSV, Вы писали:

MSV>Хочу инициализировать массив в конструкторе.

MSV>Но может быть все же есть вариант с инициализацией в конструкторе?
В списке инициализации конструктора прокатывает только инициализация нулем. Все другие выиды инициализации — только в теле конструктора.
Если значения массива одинаковы для всех объектов, и массив небольшой, то можно его сделать статическим и проинициализировать явно прит определении.
Иначе делайте конструктор инициализации.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[5]: Иницмализация массива в конструкторе
От: Vamp Россия  
Дата: 11.08.11 12:19
Оценка:
MSV>Подключение stl к программе это событие, как праздник. Не хочу себя так радовать.
Я так понимаю, что C++0x и списки инициализации как тип в std это еще больший праздник, и советовать не стоит?
Да здравствует мыло душистое и веревка пушистая.
Re: Иницмализация массива в конструкторе
От: barmafon  
Дата: 15.08.11 10:58
Оценка:
Здравствуйте, MikelSV, Вы писали:

Например, как-нибудь так:

#include <boost/array.hpp>

template<class T>
boost::array<T, 4> array_initializer(const T& t1, const T& t2, const T& t3, const T& t4)
{
    boost::array<T, 4> a = {t1, t2, t3, t4};
    return a;
}

class TestBContX{
public:
    boost::array<int, 4> d;
    TestBContX() : d(array_initializer(1, 2, 3, 4)) {    }
};
Re[2]: Иницмализация массива в конструкторе
От: Murom Россия  
Дата: 15.08.11 11:48
Оценка:
Здравствуйте, barmafon, Вы писали:

B>Здравствуйте, MikelSV, Вы писали:


B>Например, как-нибудь так:


B>[ccode]

B>#include <boost/array.hpp>

Для человка stl уже много, а буст его просто порвет.
- Eugeny
Re[3]: Иницмализация массива в конструкторе
От: _nn_ www.nemerleweb.com
Дата: 15.08.11 12:50
Оценка: 1 (1)
Здравствуйте, Murom, Вы писали:

M>Здравствуйте, barmafon, Вы писали:


B>>Здравствуйте, MikelSV, Вы писали:


B>>Например, как-нибудь так:


B>>[ccode]

B>>#include <boost/array.hpp>

M>Для человка stl уже много, а буст его просто порвет.


Да тут и без буста можно:
template<typename T, size_t N>
struct array { T elems[N]; };

template<class T>
array<T, 4> array_initializer(const T& t1, const T& t2, const T& t3, const T& t4)
{
    array<T, 4> a = {t1, t2, t3, t4};
    return a;
}

class TestBContX{
public:
    array<int, 4> d;
    TestBContX() : d(array_initializer(1, 2, 3, 4)) {    }
};


Вуаля
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Иницмализация массива в конструкторе
От: IROV..  
Дата: 15.08.11 17:36
Оценка:
Здравствуйте, Vamp, Вы писали:

MSV>>Эм, знаете, я не люблю std,

V>Печально. Я полагаю, что ты умеешь его готовить.
Это что за кухня то такая? советовать вместо массива std::vector, даже не поинтерисовавшись зачем ему нужен массив.

MSV>>поэтому не знаю, как добрыми словами спросить, зачем тут vector?

V>Затем, что вектор, как правило, удобнее встроенного массива.
Удобней для чего?
у меня
class Vector3
{
float v[3];
}

мне будет удобней использовать std::vector<float>?

MSV>>Я хочу именно массив. Определенной длинны с определенными данными, которые будут шустро использоваться.

V>Вектор удовлетворяет этим требованиям.
Нет.
я не волшебник, я только учусь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.