Воскресенье, 22 Декабря 2024, 06:40

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Вопрос опытным программистам
ApatiДата: Воскресенье, 24 Января 2010, 11:41 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
И так, допустим у меня есть класс с двумя конструкторами:
Code
class q
{
public:
         int a;
         q(){a=0;}
         q(int z,int x){a=z+x;}
};

При создании объектов этого класса мне надо воспользоваться конструктором q(int z,int x).
Если создается 1 объект, то там все понятно:

Code
q a(1,2);
q *b=new q(1,2);

Но как быть, если создается массив объектов (как динамический, так и статический)?

На компиляторе GCC мне удалось это сделать только со статическим массивом:

Code
q c[2]=q::q(1,2);

Но на MVC такая вещь не прошла.
vcДата: Воскресенье, 24 Января 2010, 13:00 | Сообщение # 2
участник
Сейчас нет на сайте
Хм попробуй- q==c[2]=::*q(1,2);

Добавлено (24.01.2010, 12:51)
---------------------------------------------
q c[2]=q::q()-вот корректный на прошлый не смотри

Добавлено (24.01.2010, 12:56)
---------------------------------------------
class q
{
public:
int a;
q(){a=0;}
q(int z,int x){a=z+x;}
};
q a(1,2);
q *b=new q(1,2);
q c[2]=q::q();
он полностью корректен

Добавлено (24.01.2010, 12:59)
---------------------------------------------
q c[2]=q::q()-после 2ой скобки выбери в конструкторе int x,int z

Добавлено (24.01.2010, 13:00)
---------------------------------------------
то есть наоборот

BOOMДата: Воскресенье, 24 Января 2010, 13:09 | Сообщение # 3
I am the creator of ADE
Сейчас нет на сайте
Quote (Apati)
Но как быть, если создается массив объектов (как динамический, так и статический)?

С татическим объектом ты правилно сделал. По иде должны работать два варианта:
Quote

q a[n] = q::q();
//И
q b[n] = q::q(x, y);

А с динамичными будит посложнее. Можно использовать принцип map либо vector (Эти классы упрощают работу с динамичным множеством.), используя простые функции создания и освобождения памяти.

Quote

...
bool CreateObj(X, Y);
bool FreeObj();
...

Содержания этих функций зависит от того, какой динамичный массив будет использован, map или vector.
P.S. Ищи include-файлы с индеитичными именами (map, vector)

Еще подсказочка.
Используй эти функции при добавлении(CreateObj) и удалении(FreeObj) из памяти. Таким методом оптимизируешь память, выделяемую для динамичных классов.


______________________________
Я вернулся, и это чудо.
______________________________
vcДата: Воскресенье, 24 Января 2010, 13:12 | Сообщение # 4
участник
Сейчас нет на сайте
У меня на dev'е всё нормально-мой вариант и твой BOOM
ApatiДата: Воскресенье, 24 Января 2010, 15:27 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
vc, ты сначала пойми суть вопроса, а потом пытайся на него ответить.
BOOM, я имел ввиду как это сделать стандартными средствами языка, не прибегая к помощи сторонних классов.
WXZRWДата: Воскресенье, 24 Января 2010, 15:43 | Сообщение # 6
Thousand faces conspiration
Сейчас нет на сайте
Quote (Apati)
Но как быть, если создается массив объектов (как динамический, так и статический)?

Правильно создавать массив.

Quote (Apati)
q c[2]=q::q(1,2);

Обьявление массива из двух элементов, при этом ты пытаешься подать только 1 элемент. Не удивительно, что VC++ отторгнет такое.

Как делать :

Code
#include "stdafx.h"

class q
{
public:
          int a;
          q(){a=0;}
          q(int z,int x){a=z+x;}
};

int main(int argc, char* argv[])
{
  q c[2] = { q::q(1,2), q::q(2,3) };

  static char b[50] = {0};

  sprintf(b,"%d %d",c[0].a,c[1].a);

  printf(b);

  return 0;
}

Программа выведет : 3 5

ApatiДата: Воскресенье, 24 Января 2010, 15:55 | Сообщение # 7
заслуженный участник
Сейчас нет на сайте
WXZRW, а что если у меня 10000 элементов в массиве и для них всех нужно использовать конструктор q(int z,int x) с одинаковыми параметрами?
WXZRWДата: Воскресенье, 24 Января 2010, 16:03 | Сообщение # 8
Thousand faces conspiration
Сейчас нет на сайте
Quote (Apati)
а что если у меня 10000 элементов в массиве и для них всех нужно использовать конструктор q(int z,int x) с одинаковыми параметрами?

Тогда немного по другому, забьем массив из 100 элементов (размер не важен) одинаковыми данными, в цикле , и проверим результат :

Code

#include "stdafx.h"

class q
{
public:
          int a;
          q(){a=0;}
          q(int z,int x){a=z+x;}
};

int main(int argc, char* argv[])
{
   
  q c[100];

  for(int i=0;i<100;i++)
  {
  c[i] = q::q(3,3);
  }

  int count = 0;

  for(int y=0;y<100;y++)
  {
  if(c[y].a == 6)
  {
  count++;
  }
  }

  static char b[50] = {0};

  sprintf(b,"%d",count);

  printf(b);

  return 0;
}

В итоге получим 100, что значит что все эленты правильно инициализованы.

ApatiДата: Воскресенье, 24 Января 2010, 16:35 | Сообщение # 9
заслуженный участник
Сейчас нет на сайте
Quote (WXZRW)
Тогда немного по другому, забьем массив из 100 элементов (размер не важен) одинаковыми данными, в цикле , и проверим результат :

Я сейчас таким способом и пользуюсь.
Проблема этого способа в том, что при создании массива сначала вызывается конструктор q(), которого в классе может и не быть и тогда будет ошибка (по крайней мере в GCC), а потом в цикле для каждого элемента вызывается деструктор и второй конструктор. Это немного не экономично, так как проще сразу при создании объекта пользоваться тем конструктором, который нужен. Вот я и хотел бы узнать способ, чтобы сразу создавать элементы массива нужным конструктором.



Сообщение отредактировал Apati - Воскресенье, 24 Января 2010, 16:37
WXZRWДата: Воскресенье, 24 Января 2010, 17:26 | Сообщение # 10
Thousand faces conspiration
Сейчас нет на сайте
Quote (Apati)
Вот я и хотел бы узнать способ, чтобы сразу создавать элементы массива нужным конструктором.

Встроенного способа присвоить всему массиву не нулевое значение не существует.

Если попытаться сделать так : q c[2] = { q::q(1,2) };, тогда только 1 элемент примет значение, остальные будут = 0. Если просто q c[2] = { }; , тогда все элементы будут равны 0. Если только q c[2]; , в таком случае данные массива будут не обозначены.

Либо тебе нужно сделать свой класс или темплейт для массивов, либо используй STL, то есть std::fill. Если нет, тогда заполняй массив циклом.

el_reyДата: Воскресенье, 24 Января 2010, 18:23 | Сообщение # 11
почетный гость
Сейчас нет на сайте
А почему бы не воспользоваться указателями?
Code

q* c[1000];

for (i=0; i<1000; ++i)
{
    c[i] = new q(1,2);
}

Нужно только не забыть освободить память.


Пишу учебник

Сообщение отредактировал el_rey - Воскресенье, 24 Января 2010, 18:39
nilremДата: Воскресенье, 24 Января 2010, 20:22 | Сообщение # 12
Просветленный разум
Сейчас нет на сайте
При создании массива объектов всегда используется конструктор по умолчанию(без параметров, или все параметры имеют значение по умолчанию).

Без вариантов.

То есть, то о чем мечтает Apati, невозможно.

Я в таких случаях использую тот способ что и el_r


Windmill 2

WindMill 2D Game Engine
ApatiДата: Воскресенье, 24 Января 2010, 21:53 | Сообщение # 13
заслуженный участник
Сейчас нет на сайте
el_rey, это все же не массив объектов, а массив указателей на объекты. В результате данные фрагментированны, что не очень хорошо.
Quote (nilrem)
То есть, то о чем мечтает Apati, невозможно.

Эх. Я в печали. Думаю тему можно закрыть.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг