Массив из объектов
От: emergen  
Дата: 12.02.15 06:13
Оценка:
Добрый день! Подскажите, пожалуйста, как в С++ самым рациональным способом сделать массив из объектов одного типа, чтобы затем вызывать (работать) однотипно с одинаковыми методами объекта:

...
obj1 = MyObject();
obj2 = MyObject();
obj3 = MyObject();

...

for(i=0; i<3; i++)
{
  obj[i].SetFlag();
}


В языке программирования Python данная конструкция выглядит следующим образом:
            for obj in [obj1, obj2, obj3]:
                obj.SetFlag()


А как такое сделать в С++?
Отредактировано 12.02.2015 15:26 Кодт . Предыдущая версия . Еще …
Отредактировано 12.02.2015 15:26 Кодт . Предыдущая версия .
Re: Массив из объектов
От: kvser  
Дата: 12.02.15 06:20
Оценка: 3 (1) +1
Здравствуйте, emergen, Вы писали:

E>Добрый день! Подскажите, пожалуйста, как в С++ самым рациональным способом сделать массив из объектов одного типа, чтобы затем вызывать (работать) однотипно с одинаковыми методами объекта:


E>...


E>obj1 = MyObject();

E>obj2 = MyObject();
E>obj3 = MyObject();

E>...


E>for(i=0; i<3; i++)

E>{

E>obj[i].SetFlag();



E>}



E>В языке программирования Python данная конструкция выглядит следующим образом:


E> for obj in [obj1, obj2, obj3]:

E> obj.SetFlag()


E>А как такое сделать в С++?


используя с с++11 так
std::array<MyObject, 3> a = {MyObject(), MyObject(), MyObject()};
for(const auto& e: a)
    e.SetFlag();
Re[2]: Массив из объектов
От: emergen  
Дата: 12.02.15 06:26
Оценка:
Здравствуйте, kvser, Вы писали:

K>Здравствуйте, emergen, Вы писали:


E>>Добрый день! Подскажите, пожалуйста, как в С++ самым рациональным способом сделать массив из объектов одного типа, чтобы затем вызывать (работать) однотипно с одинаковыми методами объекта:


E>>...


E>>obj1 = MyObject();

E>>obj2 = MyObject();
E>>obj3 = MyObject();

E>>...


E>>for(i=0; i<3; i++)

E>>{

E>>obj[i].SetFlag();



E>>}



E>>В языке программирования Python данная конструкция выглядит следующим образом:


E>> for obj in [obj1, obj2, obj3]:

E>> obj.SetFlag()


E>>А как такое сделать в С++?


K>используя с с++11 так

K>
K>std::array<MyObject, 3> a = {MyObject(), MyObject(), MyObject()};
K>for(const auto& e: a)
K>    e.SetFlag();
K>


в данном случае на протяжении всей программы после этого цикла нужно будет обращаться к данным объектам как
std::array[0].setFlag(); //это первый элемент массива
std::array[1].setFlag(); //это второй элемент массива
std::array[3].setFlag(); //это третий элемент массива

а как сделать так чтобы обращаться по их названию? типа:
obj1.setFlag(); //это первый элемент массива
obj2.setFlag(); //это второй элемент массива
obj3.setFlag(); //это третий элемент массива
Re[3]: Массив из объектов
От: kvser  
Дата: 12.02.15 06:36
Оценка: 3 (1)
Читай Использование ссылок
Re[4]: Массив из объектов
От: emergen  
Дата: 12.02.15 06:54
Оценка:
Здравствуйте, kvser, Вы писали:

K>Читай Использование ссылок



Я так понял можно использовать обычные указатели на экземпляры объектов вот так:

MyObject *item_name, *item_type, *item_body;

item_name = &obj[0];
item_type = &obj[1];
item_body = &obj[2];


А вот сразу в одной конструкции это учесть можно как то?
Re[5]: Массив из объектов
От: jazzer Россия Skype: enerjazzer
Дата: 12.02.15 07:07
Оценка: 2 (1)
Здравствуйте, emergen, Вы писали:

E>А вот сразу в одной конструкции это учесть можно как то?


У тебя что первично-то — объекты obj1-3 или массив?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: Массив из объектов
От: emergen  
Дата: 12.02.15 07:11
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, emergen, Вы писали:


E>>А вот сразу в одной конструкции это учесть можно как то?


J>У тебя что первично-то — объекты obj1-3 или массив?


первично создаются экземпляры объектов


obj1 = new MyObject();

obj2 = new MyObject();

obj3 = new MyObject();


Массив объектов необходим чтобы выполнить одинаковые вызовы методов.
Re[7]: Массив из объектов
От: emergen  
Дата: 12.02.15 07:14
Оценка:
Здравствуйте, emergen, Вы писали:

E>Здравствуйте, jazzer, Вы писали:


J>>Здравствуйте, emergen, Вы писали:


E>>>А вот сразу в одной конструкции это учесть можно как то?


J>>У тебя что первично-то — объекты obj1-3 или массив?


E>первично создаются экземпляры объектов



E>obj1 = new MyObject();


E>obj2 = new MyObject();


E>obj3 = new MyObject();



E>Массив объектов необходим чтобы выполнить одинаковые вызовы методов.



Будет ли такой код работать?

MyObject *obj1, *obj2, *obj3;


obj1 = new MyObject();

obj2 = new MyObject();

obj3 = new MyObject();


std::array< MyObject&, 3> a = { obj1, obj2, obj3 };

???
Re: Массив из объектов
От: Evgeny.Panasyuk Россия  
Дата: 12.02.15 07:36
Оценка: 8 (3) +1
Здравствуйте, emergen, Вы писали:

E>В языке программирования Python данная конструкция выглядит следующим образом:

E> for obj in [obj1, obj2, obj3]:
E> obj.SetFlag()
E>А как такое сделать в С++?

C++11:
#include <initializer_list>

struct Foo { void method() {} };

int main()
{
    Foo a,b,c;
    for(auto x : {&a, &b, &c})
        x->method();
}

Если a,b,c это указатели, либо допустима копия, то соответственно:
    for(auto x : {a, b, c})
        x.method();
Re[8]: Массив из объектов
От: emergen  
Дата: 12.02.15 07:36
Оценка:
Здравствуйте, emergen, Вы писали:

E>Здравствуйте, emergen, Вы писали:


E>>Здравствуйте, jazzer, Вы писали:


J>>>Здравствуйте, emergen, Вы писали:


E>>>>А вот сразу в одной конструкции это учесть можно как то?


J>>>У тебя что первично-то — объекты obj1-3 или массив?


E>>первично создаются экземпляры объектов



E>>obj1 = new MyObject();


E>>obj2 = new MyObject();


E>>obj3 = new MyObject();



E>>Массив объектов необходим чтобы выполнить одинаковые вызовы методов.



E>Будет ли такой код работать?


E>MyObject *obj1, *obj2, *obj3;



E>obj1 = new MyObject();


E>obj2 = new MyObject();


E>obj3 = new MyObject();



E>std::array< MyObject&, 3> a = { obj1, obj2, obj3 };


E>???



Похоже, что конечный вариант вот этот:

MyObject *obj1, *obj2, *obj3;


obj1 = new MyObject();

obj2 = new MyObject();

obj3 = new MyObject();


std::array< MyObject*, 3> a = { obj1, obj2, obj3 };
Re[7]: Массив из объектов
От: jahr  
Дата: 12.02.15 07:44
Оценка: 2 (1)
Здравствуйте, emergen, Вы писали:

E>Массив объектов необходим чтобы выполнить одинаковые вызовы методов.


obj1 = new MyObject();
obj2 = new MyObject();
obj3 = new MyObject();
for(auto obj: std::vector<MyObject*>({obj1, obj2, obj3}))
{
    obj->method();
}


Можно так, чтоб на питон было похоже.)

пс: vector — написал по инерции, он не нужен, тут уже ниже прислали корректный вариант
Отредактировано 12.02.2015 7:48 jahr . Предыдущая версия .
Re[9]: Массив из объектов
От: Evgeny.Panasyuk Россия  
Дата: 12.02.15 07:45
Оценка: 2 (1)
Здравствуйте, emergen, Вы писали:

E>std::array< MyObject*, 3> a = { obj1, obj2, obj3 };


Если делать через массив — то проще использовать обычный, не std::array, он тогда сам вычислит размер:
MyObject *a[] = { obj1, obj2, obj3 };
Range-based for работает и с обычными массивами (смотри std::begin/end).
Re[8]: Массив из объектов
От: ArtDenis Россия  
Дата: 12.02.15 15:12
Оценка: +1
Здравствуйте, jahr, Вы писали:

E>>Массив объектов необходим чтобы выполнить одинаковые вызовы методов.


J>for(auto obj: std::vector<MyObject*>({obj1, obj2, obj3}))

J>{


Ужос
for(auto obj: {obj1, obj2, obj3})
{
  ...
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.