Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инициализация константного динамического массива, Каждому элементу свою инициализацию 
V
    Опции темы
JackYF
  Дата 6.4.2007, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Возможно, данная тема уже пробегала на форуме. Однако, в поиске не нашел.

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

Но мне нужно создать (динамически) массив элементов данного класса, причем каждому элементу нужно задать свои параметры конструктора.

Какие есть варианты, кроме malloc + placement new (и связанных потом с этим извращений)?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
vinter
Дата 7.4.2007, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



остается еще явная инициализация, по другому вроде никак.


--------------------
Мой блог
PM MAIL WWW   Вверх
threef
Дата 7.4.2007, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Синтаксически создать массив констант нельзя. Предлагались статические варианты или,ИМХО  лучший - создать структуру, содержащую массив. Ее-то и можно проинициализировать в конструкторе.
Код


struct point
{
   int x[2];
} x={1,2};

struct classik{
 const  point ;
  classik():point(x){}
};

 

PM MAIL   Вверх
Xenon
Дата 7.4.2007, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



... Недопонял smile

Это сообщение отредактировал(а) Xenon - 7.4.2007, 02:26


--------------------
user posted image  
PM MAIL   Вверх
JackYF
Дата 7.4.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



threef, через список инициализаторов не пойдет. Мне нужен полноценный вызов конструктора с несколькими параметрами для каждого элемента....


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Xenon
Дата 7.4.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Может так?
Код

template <class T>
class Foo
{
public:
    const T* const pTr;
    Foo(T arr[],int size):pTr(new T[size])
    {
        for (int i = 0; i < size; ++i)
        {
            static_cast<T>(pTr[i]) = arr[i];
        }
    }
    ~Foo()
    {
        delete [] pTr;
    }
};


Это сообщение отредактировал(а) Xenon - 7.4.2007, 12:45


--------------------
user posted image  
PM MAIL   Вверх
JackYF
Дата 7.4.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Xenon, честно - не понял, что ты этим хотел сказать...

Мне при создании каждого элемента нужно ему в конструктор передать разные параметры...
то есть мне надо сделать код, который будет работать как:

Код

class Foo {...};

unsigned long size = 255;
void* storage = malloc (size * sizeof(Foo));
Foo* p = (Foo*)storage;
for (int i = 0; i < size; ++i )
{
  p = new(p) Foo(i, i*i + 1);
  ++p;
}
...
// working with array
p = (Foo*)storage;
for (int i = 0; i < size; ++i )
{
  //p->~Foo();
  // или
  //delete p;
  ++p;
}

//free(storage) - если через деструктор...



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Daevaorn
Дата 7.4.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(JackYF @  7.4.2007,  14:58 Найти цитируемый пост)
Xenon, честно - не понял, что ты этим хотел сказать...

Он тебе показал решение
PM MAIL WWW   Вверх
Xenon
Дата 7.4.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



JackYF, Я просто не очень понял что ты хотел. Исходя из заголовка я понял, что тебе нужен в классе константный динамический массив, который ты сможешь иницилизировать значениями, переданными в конструктор. Вот я тебе исходя из этих данных накидал пример.
Какая у тебя задача-то стоит? Зачем ЭТО?


--------------------
user posted image  
PM MAIL   Вверх
likehood
Дата 7.4.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



JackYF, может это подойдет.
PM MAIL   Вверх
likehood
Дата 7.4.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



можно еще вместо массива использовать вектор:
Код

vector<Foo> v;
for (int i=0; i<size; i++)
  v.push_back(Foo(i, i*i+1));

PM MAIL   Вверх
JackYF
Дата 7.4.2007, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(likehood @  7.4.2007,  17:04 Найти цитируемый пост)
можно еще вместо массива использовать вектор:


по-моему, тоже не пойдет.
Вектор для присваивания будет использовать стандартную семантику присваивания, то есть operator=. Что в данное случае опять-таки недопустимо, присваивание константным элементам класса можно только в конструкторе.

Цитата(Xenon @  7.4.2007,  16:22 Найти цитируемый пост)
Какая у тебя задача-то стоит?

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

Есть класс. В котором содержится массив объектов. Массив public. Каждый объект содержит содержит несколько полей, из которых пользователь может все читать, но только часть писать. Те 2 поля, которые константные, инициализируются один раз при создании и больше не изменяются.

Я подумал, что с точки зрения семантики лучше всего сделать было их константными, и тогда вопрос решался сам собой - данные инициализировались в надклассе массива, а потом можно было выдать пользователю данный массив.

Пока писал, назрело, правда, еще одно решение... Сделать эти поля не константыми, а приватными у класса, фукнцию их чтения public, функцию их записи в приват и френдом надкласс. Да, это выход. Но это менее красиво...
Да ну и вообще интересно с той точки зрения, что вообще с точки зрения программиста желания сделать массив с описанными мной свойствами возможно; и для компилятора, в общем-то, не проблема... Но вот не получается.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
JackYF
Дата 7.4.2007, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(likehood @  7.4.2007,  16:35 Найти цитируемый пост)
JackYF, может это подойдет. 


Нет, не пойдет... опять все сводится к создание уже созданного массива значений и присваивания.
Ни массива у меня нету и быть не может (а зачем мне тогда делать еще один? я лучше указатель создам),
ни присваивания... (выше написал, почему).



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
likehood
Дата 8.4.2007, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



Цитата(JackYF @  8.4.2007,  00:53 Найти цитируемый пост)
Нет, не пойдет... опять все сводится к создание уже созданного массива значений и присваивания.

Лучше покажу работающий код, а уж ты решай - пойдет он тебе или нет.
Код

#include <iostream>
struct Foo {
    const int i;
    Foo(int i) : i(i) { }
};
int main()
{
    static int curr = 0;
    struct Foo_local : public Foo {
        Foo_local() : Foo(curr*curr) { ++curr; }
    };
    Foo *foo = new Foo_local[10];
    std::cout << foo[5].i << "\n";
    delete[] foo;
    return 0;
}

PM MAIL   Вверх
Earnest
Дата 9.4.2007, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(JackYF @  8.4.2007,  00:35 Найти цитируемый пост)
Сделать эти поля не константыми, а приватными у класса, фукнцию их чтения public, функцию их записи в приват и френдом надкласс. Да, это выход. Но это менее красиво...

Срочно меняй свои представления о красоте!  smile public - данные - вот это некрасиво. Особенно в перспективе дальнейших изменений кода.

Цитата(JackYF @  8.4.2007,  00:35 Найти цитируемый пост)
Да ну и вообще интересно с той точки зрения, что вообще с точки зрения программиста желания сделать массив с описанными мной свойствами возможно; и для компилятора, в общем-то, не проблема... Но вот не получается. 

Один (уж не помню кто) из столпов программирования писал, что любую проблемму в программировании можно решить добавлением нужного числа прокладок в нужные места. Цитирую не дословно, но смысл тот.
Вот и здесь то же самое, treef уже предлагал: дополнительная структура, содержащая твой массив. массив в структуре не константный, поэтому инициализируй его как хочешь. А саму структуру в объемлющем классе сделай константной. Точно, была уже такая тема, и там это предлагали, может даже я...

Но лучше так не делай, а все спрячь подальше. Public-данные - это ЗЛО!


--------------------
...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1427 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.