crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Массивы в классе
kvak
  опции профиля:
сообщение 6.9.2010, 12:47
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 51
Регистрация: 5.5.2010
Пользователь №: 1690

Спасибо сказали: 1 раз(а)




Репутация:   0  


Здравствуйте. Вопрос касается двумерных массивов.
Стандартного и QVector
Мне нужно, чтобы массив стал общедоступен внутри всех функций моего класса.

1.
В файле header.h объявляю массив

int order_id[12][6];

В файле order.cpp, который подключает мой header.h
пытаюсь инициализировать массив.
order_id[12][6] ={
{0, 0, 0, 1, 0, 2},
//.........и так далее
};
--------
компилятор выдает ошибку. Лишь когда я в файле order.cpp сразу объявляю и инициализирую массив, то
все получается. Но тогда я не смогу его использовать как данное-член моего класса. Как быть ?

2. Второй вопрос касается двумерного массива QVector
В файле header.h объявляю двемерный массив QVector.


В файле order.cpp мне надо выполнить функцию resize, чтобы массив стал 12 на 6. Не получается с двумя

переменными. Как это можно сделать ?
Также насчет заполнения QVector. Также как я это делал со стандартным массивом. тут не получается.
Заполнять QVector обращаюсь к каждомй индексу это единственный способ его заполнить ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 6.9.2010, 13:14
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(kvak @ 6.9.2010, 15:47) *
Мне нужно, чтобы массив стал общедоступен внутри всех функций моего класса.

это автоматически и так происходит :)

1) заполняй в конструкторе. А ещё лучше - используй вектор и заполняй там же

2) двумерный массив [N][M] - это одномерный массив размером [N*M] . А в остальном - всё по пункту 1.

по пункту 2 - это в зависимости от задачи, так как бывает удобно и массив указателей на массивы делать, и один цельный массив (как написано выше)



Цитата(kvak @ 6.9.2010, 15:47) *
Заполнять QVector обращаюсь к каждомй индексу это единственный способ его заполнить ?

можно заполнить из ресурсов, из файла или из статического массива
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kvak
  опции профиля:
сообщение 6.9.2010, 18:21
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 51
Регистрация: 5.5.2010
Пользователь №: 1690

Спасибо сказали: 1 раз(а)




Репутация:   0  


Я еще новичок, кое-что не понял.
Как мне правильно объявить массив (не QVector) в описании класса
Когда я в заголовочном пишу в описании класса допустим
int order[12][6];
а потом в конструкторе в файле cpp
делаю заполнение, например order[0][0] = 1, то выдает ошибку. Так что нельзя делать что-ли ?

2. Так как сделать resize для двумерного QVector. Покажите код, если такая функция работает и для двумерного.
3. Покажите пожалуйста код, можно ли заполнить массив QVector более удобно, чем обращаясь к каждому индексу.


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 6.9.2010, 19:38
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


попробую более развёрнуто

инициализировать массив можно можно так
class A
{
    int m_order[12][6];
    
    A()
    {
        static int templ_order[3][6]={{1,2,3,4,5,6},{11,12,13,14,15,16},{21,22,23,24,25,26}};
        
        //1)
        memmove(m_order,templ_order,min(sizeof(m_order),sizeof(templ_order)));
        
        //2) или так
        m_order[0][0]=1;
        m_order[0][1]=2;
        m_order[0][2]=4;
        //....
        
        //3) или из файла
        //...
    }
};


обрати внимание на важную деталь: массив с данными для инициализации в конструкторе объявлен как static. Таким образом, массив располагается не в стеке функции и инициализируетсяч всего один раз. А вот копирование из него в массив класса будет происходить в каждом конструкторе

Цитата
Так как сделать resize для двумерного QVector. Покажите код, если такая функция работает и для двумерного.

2+3. QVector я не пользовался, но сделаешь по аналогии ) Для начала скажу, что двумерных векторов не бывает.

class A
{
    typedef int td_int;//на всякий случай сделаем синоним типу, так как важно не пролететь с длиной массива
    
    std::vector<td_int> v;
    
public:    
    A()
    {
        static td_int templ_order[3][6]={{1,2,3,4,5,6},{11,12,13,14,15,16},{21,22,23,24,25,26}};
        
        //v.clear(); //сейчас вектор пуст, как-будто выполнили эту функцию
        
        //копируем
        v.insert(
                v.end(),
                (td_int*)templ_order,
                (td_int*)templ_order+sizeof(templ_order)/sizeof(td_int));
    }
};


Сообщение отредактировал Алексей1153 - 6.9.2010, 19:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kvak
  опции профиля:
сообщение 6.9.2010, 21:30
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 51
Регистрация: 5.5.2010
Пользователь №: 1690

Спасибо сказали: 1 раз(а)




Репутация:   0  


Спасибо.

А это не двумерный QVector ?
QVector< QVector<int> > vector;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 6.9.2010, 21:35
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


это вектор векторов. Можно и двумерным считать, но такой массив будет в памяти не единым куском, а раскидан (в общем случае) в отличие от цельного массива, лежащего в одном векторе.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 8.9.2010, 14:40
Сообщение #7


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


kvak,
Цитата(kvak @ 6.9.2010, 19:21) *
Когда я в заголовочном пишу в описании класса допустим
int order[12][6];
а потом в конструкторе в файле cpp
делаю заполнение, например order[0][0] = 1, то выдает ошибку. Так что нельзя делать что-ли ?

приведи код и ошибку
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 14:27