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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> инициализация массива в списке инициализаторов, возможно ли? 
:(
    Опции темы
Sleepman
Дата 21.9.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Господа!
Вариант вообще инициализировать массив в конструкторе по умолчанию - в 
списке инициализации?

Код

class cd{
    private:
        int inv_number;
        int man_number;
        int data[780];
        char* name;
        char* descr;
    public:
        cd(int i_num = 0, int m_num = 0): inv_number (i_num), man_number (m_num), data (-1), name (0), descr(0) {}
        ~cd() {delete [] name; delete [] descr;}
};


Причем инициализировать так, чтобы было понятно - массив пуст. 
Допустим первому элементу присвоить инвалидное значение.

Пытался писать так как в примере... еще пытался след образом
data[0] (-1)
*data (-1)

Или это вообще никак нельзя сделать в списке инициализации? (в стандарт не залазил smile  )
Благодарю за ответ!
PM MAIL   Вверх
JackYF
Дата 21.9.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Я так никогда не пробовал...
По-моему, нельзя...

Тут же ж дело в том, что вызываются конструкторы дочерних объектов, наверное...

Хотя тоже в стандарт не залазил.


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


Freedom in me
**


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

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



cd(int i_num = 0, int m_num = 0): inv_number (i_num), man_number (m_num),  name (0), descr(0) {
    for(int i=0;i<dlinna_massiva;++i)
          data[i] = -1;
}



--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Sleepman
Дата 21.9.2006, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(EvgenZ @ 21.9.2006,  13:03)
cd(int i_num = 0, int m_num = 0): inv_number (i_num), man_number (m_num),  name (0), descr(0) {
    for(int i=0;i<dlinna_massiva;++i)
          data[i] = -1;
}

нет, ну здесь используется не только список инициализаторов...
а как бы использовать только его?... короче пошел шарить стандарт...  ))
PM MAIL   Вверх
Ignat
Дата 21.9.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 3
Всего: 73



Цитата(Sleepman @  21.9.2006,  16:57 Найти цитируемый пост)
а как бы использовать только его?

Гм... А использовать конструктор по назначению религией запрещено?

ЗЫ. я бы воспользовался ф-цией memset для установки в -1.


--------------------
Теперь при чем :P
PM   Вверх
Earnest
Дата 21.9.2006, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В списке инициализации массивы не инициализируются.
Если речь идет о массиве интов, то чем memset действительно не устраивает? 


--------------------
...
PM   Вверх
UnrealMan
Дата 23.9.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 27
Всего: 32



Цитата(Earnest @  21.9.2006,  19:24 Найти цитируемый пост)
Если речь идет о массиве интов, то чем memset действительно не устраивает?  

Дык memset задаст только какое-то одно значение. А если нужен именно список значений, то memset не прокатит. В этом случае можно использовать что-то вроде

Код
template <class T>
class CAssignment
{
    T *p;
    mutable size_t size;

public:
    CAssignment(T *begin, size_t size) : p(begin), size(size) {}
    CAssignment(const CAssignment &other) : p(other.p), size(other.size) { other.size = 1; }
    CAssignment &operator ,(const T &t)
    {
        *++p = t;
        --size;
        return *this;
    }
    CAssignment &operator =(const T &t)
    {
        *p = t;
        return *this;
    }
    ~CAssignment()
    {
        for (; --size; *++p = T());
    }
};

template <class T, size_t size>
CAssignment<T> Assignment(T (&arr)[size])
{
    return CAssignment<T>(arr, size);
}

int main()
{
    int array1[10] = {1, 2, 3, 4};
    int array2[10];
    Assignment(array2) = 1, 2, 3, 4; // список присваиваемых значений
    
    for (int i=0; i<10; ++i)
        cout<<array1[i]<<' ';
    cout<<endl;

    for (int i=0; i<10; ++i)
        cout<<array2[i]<<' ';
    cout<<endl;

    return 0;
}

Этот код можно улучшить так, чтобы выявлялись некоторые ошибки времени компиляции (вроде слишком длинного списка).

Это сообщение отредактировал(а) UnrealMan - 23.9.2006, 12:34
PM MAIL   Вверх
registered
Дата 23.9.2006, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



Цитата(Sleepman @  21.9.2006,  12:44 Найти цитируемый пост)
Господа!
Вариант вообще инициализировать массив в конструкторе по умолчанию - в 
списке инициализации?


если нужен не инициализированный, то
std::vector<int> data;

тогда он просто пустой

если нужно в конструкторе инициализировать значениями, что

*.h
Код

class cd{
    std::vector<int> data;
};


и инициализация 
*.cpp
Код

#include <boost/assign/list_of.hpp>
std::vector<int> cd::data = boost::assign::list_of
    (1) (2) (3) ...;


PM MAIL   Вверх
SergeCpp
Дата 28.9.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



Не существует способа явного указания аргументов конструктора (за исключением использования списка инициализации) при объявлении массива

К счастью, это ограничение можно сравнительно легко обойти. Например, посредством введения локального класса

Код
#include <stdio.h>

struct A {  // исходный класс
       int a;
       A(int a_) : a(a_) { printf("%d\n",a); }
};

void f()
{
 static int vals[]={2, 0, 0, 4};
 static int curr=0;

 struct A_local : public A {  // вспомогательный локальный
        A_local() : A(vals[curr++]) { }
 };

 A_local arr[4];
 // и далее используем как A arr[4];
}

int main()
{
 f();
}

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

Цитата
9.8 Объявления локальных классов [class.local] 

Класс может быть определен внутри функции; такой класс называется локальным (local) классом. Имя локального класса является локальным в окружающем контексте (enclosing scope). Локальный класс находится в окружающем контексте и имеет тот же доступ к именам вне функции, что и у самой функции. Объявления в локальном классе могут использовать только имена типов, статические переменные, extern переменные и функции, перечисления из окружающего контекста. Например: 
int x;
void f()
{
 static int s;
 int x;
 extern int g();

 struct local {
        int g() { return x; }   // ошибка, auto x
        int h() { return s; }   // OK
        int k() { return ::x; } // OK
        int l() { return g(); } // OK
 };
 //  ...
}

local* p = 0;  // ошибка: нет local в текущем контексте

Окружающая функция никаких специальных прав доступа к членам локального класса не имеет, она подчиняется обычным правилам (см. раздел 11 [class.access]). Функции-члены локального класса, если они вообще есть, должны быть определены внутри определения класса. 

Вложенный класс Y может быть объявлен внутри локального класса X и определен внутри определения класса X или же за его пределами, но в том же контексте (scope), что и класс X. Вложенный класс локального класса сам является локальным. 

Локальный класс не может иметь статических данных-членов.

...из книги Сергея Деревяго — C++ 3rd: комментарии

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

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

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

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

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


 




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


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

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