Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 5.00
3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
#1

Инициализация массива после объявления - C++

18.05.2012, 00:48. Просмотров 2265. Ответов 7
Метки нет (Все метки)

Привет народ, нужна ваша помощь. Допустим у меня есть класс с закрытым полем-массивом:

C++
1
2
3
4
5
6
//someClass.h
class someClass{
    int arr[2][2];
public:
    someClass();
};
В нём конструктор, в котором надо проинициализировать этот массив. Я конечно могу каждый элемент инциализировать отдельно:

C++
1
2
3
4
5
6
7
8
9
//someClass.cpp
#include "someClass.h"
 
shape::shape(){
    arr[0][0] = 5;
    arr[0][1] = 6;
    arr[1][0] = 4;
    arr[1][1] = 2;
}
Но это как-то громоздко. Можно ли этот массив проинициализировать так как это можно делать при объявлении, т.е. как-нибудь наподобие "arr[2][2] = {{5, 6}, {4,2}};?

PS класс я сюда приплёл, т.к. как раз в случае с классом, насколько я понимаю, нельзя проинициализировать массив при объявлении.

Добавлено через 20 минут
Цитата Сообщение от 3BEPb_TyTa Посмотреть сообщение
shape::shape(){
Тут забыл поменять название класса на "someClass", если это кого-то смутило )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2012, 00:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Инициализация массива после объявления (C++):

Инициализация полей во время объявления класса - C++
Инициализировать поля класса во время его объявления возможно только если в классе отсутствует конструктор? По каким то ещё принципам можно...

Ошибка компиляции после объявления класса - C++
Что не так в этом коде? Писал программку, не хочет запускаться. Упростил до минимума,все равно не работает! #include <iostream>; ...

Странное поведение cout после объявления объекта класса - C++
List words; string strg; сin >> strg; сout << strg; Ничего не выведет, пока в поток вывода не отправится endl или \n. Если...

Объявления массива. - C++
Как увеличить количество переменных в массиве?

После объявления деструктора программа перестает выводить данные на экран - C++
Помогите, плиз! Без деструктора программа работает (правда, компилятор возмущается, что их нет). После того, как я его добавляю, данные...

rand + ошибки объявления массива - C++
Здравствуйте. У меня такое задание: Используя датчик случайных чисел, заполнить элементы массива неповторяющимися числами. Вот мой код....

7
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
18.05.2012, 00:53 #2
Насколько я знаю, так нельзя. Можно инициализировать в интерфейсе класса только статические поля и константные объекты, а в конструкторе по сути дела только поэлементное присваивание
0
daslex
1284 / 528 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
18.05.2012, 02:57 #3
Плохо знаете. Конструктор для того и нужен, чтобы то что в классе находится можно было инициализировать. Любой многомерный массив можно рассматривать как одномерный

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <conio.h>
#include <iostream.h>
      class MyClass
       {
    int Arr[3][3];
    public:
     MyClass()
      {
       int A[3][3]={1,2,3,4,5,6,7,8,9}; //Инициализация двумерного массива 3*3
       for (int i=0;i<3;i++) //
        for (int j=0;j<3;j++)
         Arr[i][j]=A[i][j]; //Передача инициализированного массива в переменную класса
       }
       void ShowArray(); //Для вывода массива на экран
       };
 
       void MyClass::ShowArray() //Выводим массив на экран
    {
     for (int i=0;i<3;i++)
      for (int j=0;j<3;j++)
       {
        if (!(j%3)) cout<<endl; 
        cout<<Arr[i][j]<<'\t';
       }
    }
 
    MyClass obj1;
 
void main()
{
 clrscr();
      obj1.ShowArray();
 getch();
 return;
}
1
3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
18.05.2012, 04:54  [ТС] #4
Всем спасибо)
0
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
18.05.2012, 11:59 #5
daslex, это вы меня не поняли. Я имел в виду, что такой способ инициализации можно использовать только при объявлении массива, но т.к. массив объявляется в интерфейсе класса, то и инициализировать его там никак нельзя, разве что когда он объявлен как статический или как константный. А то что вы написали, по сути, является банальным поэлементным присваиванием, как я и говорил
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
18.05.2012, 12:15 #6
Гон товарищи.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
template<int Size>
class Arr
{
public:
   Arr():array{1,2,3,4}
   {
   }
   int array[Size];
};
 
int main()
{
   Arr<4> arr;
   std::cout << arr.array[0] << std::endl;
}
http://liveworkspace.org/code/b0104f333c314af4f385aa90449f572a

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <random>
#include <vector>
#include <algorithm>
#include <iterator>
 
template<int Size>
class Arr
{
public:
   Arr():array{{1, 2}, {2, 3}}
   {
   }
   int array[Size][Size];
};
 
int main()
{
   Arr<2> arr;
   std::cout << arr.array[0][0] << std::endl;
}
http://liveworkspace.org/code/a838d97c8eb342a3fb777d7087480fd0

Естессно так можно делать только используя новый стандарт.
0
daslex
1284 / 528 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
18.05.2012, 16:54 #7
Buckstabue, прочитайте то что писал пользователь:
Цитата Сообщение от 3BEPb_TyTa Посмотреть сообщение
В нём конструктор, в котором надо проинициализировать этот массив
Речи про прямую инициализацию массива внутри интерфейса класса не было.
Да, я использовал поэлементную передачу данных вовнутрь класса. Но этот ответ соответствует заданному вопросу.

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


Всё таки вы плохо материал знаете. Вот вам не поэлементно, а сразу

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <conio.h>
#include <iostream.h>
 
 class MyClass
  {
   int Arr[3][3];
   public:
    MyClass()
     {
      int A[3][3]={1,3,4,6,};
      memmove(Arr,A,9);
     }
     void Show();
  };
 
  void MyClass::Show()
   {
    for (int i=0;i<3;i++)
     {
      for (int j=0;j<3;j++)
       {
        cout<<Arr[i][j]<<" ";
       }
       cout<<endl;
     }
   }
 
 
   MyClass obj1;
void main()
{
 clrscr();
     obj1.Show();
 getch();
 return;
}
1
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
19.05.2012, 16:13 #8
daslex, Это откровенный костыль. То же самое могу доказать, что true == false . Для этого достаточно приписать #define true false
0
19.05.2012, 16:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2012, 16:13
Привет! Вот еще темы с ответами:

Объяснить строку объявления массива - C++
Ньюанс int* array = new int; на С/C++ Пришлость мне недавно C# код в почти голый C(C++) переписывать. Как-то прощелкал и след....

Функция объявления двумерного массива - C++
Данный код - объявляет двумерный массив arr. Как из этого куска кода сделать функцию? Передаваемые параметры как мне кажется n и m, а...

Инициализация массива - C++
int ** mas, n; cout &lt;&lt; &quot;Введите порядок треугольника паскаля: &quot; &lt;&lt; endl; cin &gt;&gt; n; mas = new int * ; for (int i = 0; i &lt; n;...

Инициализация массива C++ - C++
Почему, если мы не инициализируем переменную, то при попытке работы с ней будет ошибка int main(){ char x; cout &lt;&lt; x; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru