LINUX.ORG.RU

Создание объектов цикле


0

0

Подскажие как создать в цикле создать объекты. Т.е. есть класс и консткрутор например T1, и надо создать 5 объектов типо можно :
T1 obj1();
T1 obj2();
T1 obj3();
T1 obj4();
T1 obj5();
А как сделать это сделать в цикле от 1 до 5 и чтобы создалось 5 объектов с такими названиями?
И еще можно сделать так:
запихать в массив названия (чаровский масиив)
а потом сделать типо так:
for (int i=0; i<5; i++)
T1 mas[i];
Так как-то будет работать?
П.С. С++.
Заранее благодарю за ответ.

★★

>Так как-то будет работать? Очевидно, что не будет.

anonymous
()
Ответ на: комментарий от anonymous

Хотелось тупо создать кучу объектов одного класса с разницей в название только в индексе с помощью цикла и также еще хотелось чтобы можно было набить в массив название объектов и создать объекты с этими именами.

DDR ★★
() автор топика

а в python можно и не так

anonymous
()

>Так как-то будет работать?

Может просто самому написать и проверить? Свой опыт лучше, чем тыщи советов..

stave ★★★★★
()

так будет работать, например, в Tcl, но ни разу не в C++

std::vector<T1> obj;

for(int i = 0; i < 5; ++i)
{
  T1 temp = new T1;

  obj.push_back(temp);
}

имена будут:
obj[0]
obj[1]
...

такой вариант устраивает?

jtootf ★★★★★
()
Ответ на: комментарий от DDR

если очень охота извратится то юзай препроцессор.

wfrr ★★☆
()
Ответ на: комментарий от DDR

>В принципе да, но надо в С++, но круче былоб без [] :)

тогда исключительно через препроцессор

вот только зачем?

jtootf ★★★★★
()
Ответ на: комментарий от wfrr

Короче так, типо симуляция пассажиро-потока в транспорте (на примере 1 автобуса). Т.е. у нас есть случайное число человек (объектов класса человек) заходят в автобус (конструктором создаются столько же объектов класса пассажир и им присваюиваются св-ва тех человек, а человеки "убиваются"). Ну дык вот когда я сгенерю случайное число (кол-во человек на остановке) надо создать столькоже объектов, вопрос как?

DDR ★★
() автор топика
Ответ на: комментарий от DDR

> надо создать столькоже объектов, вопрос как?

Сказали же используй контейнеры, тот же vector.

anonymous
()
Ответ на: комментарий от wfrr

6.10.3.4

2 If the name of the macro being replaced is found during this scan of the replacement list (not including the rest of the source file’s preprocessing tokens), it is not replaced. Furthermore, if any nested replacements encounter the name of the macro being replaced, it is not replaced. These nonreplaced macro name preprocessing tokens are no longer available for further replacement even if they are later (re)examined in contexts in which that macro name preprocessing token would otherwise have been replaced.

В этом вся соль препроцессора -- он ограниченный. Никогда не возникнет ситуация что компиляция займет неделю или вообще не остановится из-за препроцессора. Но это и означает что циклов и рекурсии в нем нет.

dilmah ★★★★★
()
Ответ на: комментарий от DDR

епть юзай вектор, и не парься, в цикле добавляешь в него

vector<People> peoples;
int peopleCount = rand();
for(;peoples.put(new People());--peopleCount);

зы. не пиши только все в форе

wfrr ★★☆
()
Ответ на: комментарий от wfrr

Ок, всем спасибо огромное:)

DDR ★★
() автор топика
Ответ на: комментарий от dilmah

в дев был недавно топик, там кто-то извращался с принтфом, ему предложили использовать мкросы из буста реализующие функционал сродни циклам. Топик найти не могу.

ps. про рекурсию я ошибся

wfrr ★★☆
()
Ответ на: комментарий от dilmah

Хм, возможно, а рекурсия мне привиделась в еще более древнем топике про программку на 10 строчек которой для компиляции не хватало 512 мегабайт, однако я ее нашел и оказалось что там просто макрос скопирован несколько раз.

wfrr ★★☆
()
Ответ на: комментарий от wfrr

> и оказалось что там просто макрос скопирован несколько раз.

Там вроде старая шутка про геометрическую прогрессию была.

anonymous
()
Ответ на: комментарий от wfrr

> vector<People> peoples;
        ^^^^^^^^

> for(;peoples.put(new People());--peopleCount);
                   ^^^^^^^^^^^^


Блин. Второй раз  в треде подбная конструкция. Это какой язык вообще?

anonymous
()
Ответ на: комментарий от wfrr

Мне тут вот чо подумать допомогли =)
vector<People> peoples;
int peopleCount = rand() % x;
for(;peopleCount!0;--peopleCount)peoples.put(new People());

DDR ★★
() автор топика
Ответ на: комментарий от DDR

> vector<People> peoples;
> int peopleCount = rand() % x;


> for(;peopleCount!0;--peopleCount)peoples.put(new People());

while (peopleCount-- > 0) peoples.push_back(People());

anonymous
()
Ответ на: комментарий от dilmah

>а, помню тот топик. Но там 99% не один препроцессор использовался, а в упряжке с шаблонами.

да глянь ты наконец реализацию BOOST_PP_REPEAT
пример:

#define A_0(a) a(0);
#define A_1(a) A_0(a) a(1);
#define A_2(a) A_1(a) a(2);
#define A_3(a) A_2(a) a(3);

#define B(count,a) A_##count(a)

void foo(int n);

/* 4 раза вызвать foo(n) */
B(3,foo)

результат:

foo(0); foo(1); foo(2); foo(3);

anonymous
()
Ответ на: комментарий от anonymous

эта да условие окончания цикля я нетуда воткнул. Кстати автор не забуть про то что нужен вектор указателей а не обьектов (тут матерные слова про то что я напроч забыл нет ли зарытых собак в напихивании указателей в стл шаблоны)

wfrr ★★☆
()
Ответ на: комментарий от wfrr

Смартпойнтеры использовать нужно. А в твоём примере тупо ошибка - vector элементов типа People, а пихаешь ты туда People*.

anonymous
()
Ответ на: комментарий от anonymous

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

wfrr ★★☆
()
Ответ на: комментарий от wfrr

Автор топика языка, судя по всему, ещё толком не знает. Поэтому идеями без корректного кода его лучше не кормить :)

anonymous
()

Правильно было бы сначала описать задачу, чтобы подсказали каким образом её решить. Запомните, если в вашей задаче возникает необходимость обвязаться макросами и переменными obj1, obj2, obj3 - скорее всего у вас ошибка на этапе проектирования. В данном случае - задача предполагает _динамическое_ количество обьектов, то-есть неопределённое на этапе компиляции. Вы же пытаетесь притынуть за уши _статическое_ количесиво обьектов.

Как уже сказали - создавайте массив (std::vector, std::list) и в цикле создавайте свои обьекты.

И пожалейте себя - избегайте мутабельных операций в условиях. Такой код компилируется точно так же, но при этом на порядок читабельней:

std::list itemsList;
for ( int i = 0; i < itemsCount; ++i )
itemsList << Item();

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

> И пожалейте себя - избегайте мутабельных операций в условиях.

Что такое мутабельная операция?

anonymous
()
Ответ на: комментарий от anonymous

>Что такое мутабельная операция?
+1 ?
И еще вопрос а где я пытался притянуть статическое кол-во объектов к динамическому?:) (в том что хотел создать массив имен и его юзать?)
П.С. всем огромное спасибо за идеи и конкрентные реализации.

DDR ★★
() автор топика
Ответ на: комментарий от DDR

Вот нашел тут: mutable указывает что член должен хранится таким способом. что допускается его модификация , даже если он является членом конст. объекта. (не при каких условиях не является конст).
Вопрос только где это у меня?

DDR ★★
() автор топика
Ответ на: комментарий от DDR

Скорее всего имелось ввиду, что не стоит допускать операции, которые что-то изменяют, кроме счетчика, в условии цикла. Например, put(new People()) ниже

> for(;peoples.put(new People());--peopleCount);

anonymous
()
Ответ на: комментарий от DDR

> Что такое мутабельная операция?

Имелось в виду избегание операций, изменяющих данные в теле условия (не счётчика). Условие должно содержать только проверку, таким обрахом читатель не запутается в его смысле. А счётчик должен быть в счётчике.

Плохой код:

for ( int i = myVector.size(); i--; ) // do something

Хороший код:

for ( int i = myVector.size()-1; i >= 0; --i ) // do something

> И еще вопрос а где я пытался притянуть статическое кол-во объектов к динамическому?

Тем что попыпались использовать заранее неопределённое на этапе _выполнения_ количество обьектов в виде C++ переменных. Конечно в стеке можно выделить некоторую память непределённого размера, но только для ускорения некоторых операций в специфических случаях. Если вы как новичёк думаете решить задачу с помощью макросов, значит скорее всего вы что-то делаете не так.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

> Имелось в виду избегание операций, изменяющих данные в теле условия (не счётчика). Условие должно содержать только проверку, таким обрахом читатель не запутается в его смысле. А счётчик должен быть в счётчике. Плохой код: for ( int i = myVector.size(); i--; ) // do something Хороший код: for ( int i = myVector.size()-1; i >= 0; --i ) // do something

4.2

это вопрос стиля и привычных идиом. Первый код короче, и он является для меня привычной идиомой, я сразу знаю как будет меняться i, потому что я к этому привык. Не понимаю чем этот хуже. Наоборот он лучше, потому что второй код длиннее и все только путает.

dilmah ★★★★★
()
Ответ на: комментарий от Dendy

> Плохой код:

> for ( int i = myVector.size(); i--; ) // do something

> Хороший код:

> for ( int i = myVector.size()-1; i >= 0; --i ) // do something

Может быть для каких-то других языков это и справедливо. Но не для С++. Ибо в нем этот якобы плохой код - вполне привычная и понятная идиома (хотя вместо i--; лучше все же было бы --i >= 0; :) ).

Псевдохороший же пример кода отличается утомительной многословностью, он скорее типичен для недавно перешедших на С/С++ c других языков (того же паскаля etc).

P.S. И не лень же спорить о фигне. :)

anonymous
()
Ответ на: комментарий от anonymous

Хороший код - тот что останется очевиден с первого взгляда через много лет случайному китайцу, в него заглянувшему. Видал я товарищей, что пытались "экономить на буквах", сокращая название переменных, классов, выкидывая лишние отступы, переносы строк, не писавшие комментарии. В результате код закручивается в Гордиев узел, а мозги в трубочку, пытаясь понять что же имел в виду автор.

Экономия на буквах имеет смысл для повышения эргономики, минимизации ошибок. Имеется в виду эргономика читабельности кода, а не места на диске или скорости кодирования.

Dendy ★★★★★
()
Ответ на: комментарий от anonymous

>> T1 temp = new T1;

>Это из какого языка?

буквоед. T1 * temp = new T1;

jtootf ★★★★★
()

и вообще, встрой в свой плюсовый проект интерпретатор Tcl и будет тебе счастье

jtootf ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.