Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 5.00
3BEPb_TyTa
 Аватар для 3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
18.05.2012, 00:48     Инициализация массива после объявления #1
Привет народ, нужна ваша помощь. Допустим у меня есть класс с закрытым полем-массивом:

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", если это кого-то смутило )
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2012, 00:48     Инициализация массива после объявления
Посмотрите здесь:

C++ После объявления деструктора программа перестает выводить данные на экран
Инициализация массива C++
инициализация массива C++
C++ rand + ошибки объявления массива
C++ Объявления массива.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
18.05.2012, 00:53     Инициализация массива после объявления #2
Насколько я знаю, так нельзя. Можно инициализировать в интерфейсе класса только статические поля и константные объекты, а в конструкторе по сути дела только поэлементное присваивание
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
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;
}
3BEPb_TyTa
 Аватар для 3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
18.05.2012, 04:54  [ТС]     Инициализация массива после объявления #4
Всем спасибо)
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
18.05.2012, 11:59     Инициализация массива после объявления #5
daslex, это вы меня не поняли. Я имел в виду, что такой способ инициализации можно использовать только при объявлении массива, но т.к. массив объявляется в интерфейсе класса, то и инициализировать его там никак нельзя, разве что когда он объявлен как статический или как константный. А то что вы написали, по сути, является банальным поэлементным присваиванием, как я и говорил
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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/b0104f...85aa90449f572a

Добавлено через 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/a838d9...777d7087480fd0

Естессно так можно делать только используя новый стандарт.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2012, 16:13     Инициализация массива после объявления
Еще ссылки по теме:

Странное поведение cout после объявления объекта класса C++
C++ Функция объявления двумерного массива
C++ Объяснить строку объявления массива

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

Или воспользуйтесь поиском по форуму:
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
19.05.2012, 16:13     Инициализация массива после объявления #8
daslex, Это откровенный костыль. То же самое могу доказать, что true == false . Для этого достаточно приписать #define true false
Yandex
Объявления
19.05.2012, 16:13     Инициализация массива после объявления
Ответ Создать тему
Опции темы

Текущее время: 16:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru