Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив из объектов двух классов, вопрос по ООП 
:(
    Опции темы
Mad
Дата 14.10.2005, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



Цитата(LPBOY @ 14.10.2005, 17:37)
Еще там есть ссылка на объект класса.

Да вспомнил, есть там такое (просто никогда не использую, по факту тотже указатель, только в профиль smile), к тому-же выше уже два раза сказали :

Цитата(Void @ 14.10.2005, 17:10)
Массивы ссылок действительно явно запрещены в стандарте.

Цитата(srd @ 14.10.2005, 17:11)
Массива ссылок в Си++ нет.


А если надо получать доступ не только к полям радительского класса, то делаеш массив указателей:
Код

class A
{
    A();
}

class AA : public A
{
    AA(int a);
}

class AB : public A
{
    AB(float b);
}

A* array[10]; //вызовутся конструкторы A::A()

array[0] = new AA(1);
array[1] = new AB(1.25f);



Это сообщение отредактировал(а) Mad - 14.10.2005, 18:47


--------------------
user posted image
PM MAIL   Вверх
LPBOY
Дата 14.10.2005, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Цитата(nikitao @ 14.10.2005, 18:42)
Приведи пример(сам че то я не догоняю).

Смысл тот же что и с указателями: например, можно создать массив в котором хранятся указатели на некий базовый класс. Тогда в нем можно хранить и указатели на производный класс. Фактически получаем массив разнородных объектов. Вызываемые виртуальные функции элементов массива будут делать нечто разное, в зависимости от динамического типа объекта. В С++ для ссылок неопределено должны ли они занимать место в памяти, поэтому всякие действия, которые могут привести к потребности знать адрес ссылки - запрещены: указатель на ссылку, массив ссылок. Хотя это можно обойти, например, вот так:
Код

#include <iostream>

template<class T>
class ref_wrapper
{
private:
    T& ref_;
public:
    ref_wrapper(T& r):ref_(r){}

    void f() {ref_.f();}
};

struct Base
{
public:
    virtual void f(){std::cout << "Base::f()" << std::endl;}
};

struct Derived: Base
{
public:
    void f() {std::cout << "Derived::f()" << std::endl;}
};

int main()
{
    ref_wrapper<Base> obj1 = *new Derived;
    ref_wrapper<Base> obj2 = *new Base;
    ref_wrapper<Base> array[2] = {obj1, obj2};
    for(int i=0; i<2; ++i)
        array[i].f();
    return 0;
}

выдаст:
Цитата

Derived::f()
Base::f()

Добавлено @ 19:16
Цитата(Mad @ 14.10.2005, 18:46)
к тому-же выше уже два раза сказали :

4 раза: 2 раза srd, 1 раз void и 1 раз я smile
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
LPBOY
Дата 14.10.2005, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Цитата(Mad @ 14.10.2005, 18:46)
A* array[10]; //вызовутся конструкторы A::A()

Нет, элементы-то указатели.
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
GremlinProg
Дата 14.10.2005, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 3
Всего: 106



Ради такого примера совсем необязательно создавать массив ссылок. Достаточно описать в базовом классе виртуальную функцию, например Create. А если нужна функция именно с разными параметрами, то вот ещё один вариант:
Код

new(&array[i])AA(1)

и
Код

new(&array[i])AB(1.25)

при условии, что архитектура классов, действительно неизменна

Это сообщение отредактировал(а) GremlinProg - 14.10.2005, 19:34


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
LPBOY
Дата 14.10.2005, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Цитата(GremlinProg @ 14.10.2005, 19:29)
Ради такого примера совсем необязательно создавать массив ссылок.

Я сделал это не "ради такого примера", а чтобы показать как обходным путем создать массив ссылок. Класс-враппер во время выполнения исчезает и получается, что в массиве находятся ссылки.


Цитата(GremlinProg @ 14.10.2005, 19:29)
вот ещё один вариант:

Если размеры базового и производных классов отличаются (что обычно и бывает), то ничего хорошего в этом варианте не получится smile
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
GremlinProg
Дата 14.10.2005, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 3
Всего: 106



вообще-то как раз архитектура-то и не меняется, смотри первое сообщение. Так что это всё таки вариант неплохой.



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
LPBOY
Дата 14.10.2005, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Хорошо, приведи минимальный работающий пример твоего способа, чтобы я вкурил - о чем ты smile
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
nikitao
Дата 14.10.2005, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



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

smile Вообщето это еще я сказал(самым первым),код правда не привел.См совсем высоко.
Вопрос мой в другом зачем именно ссылки(не указатели)можно использовать(независимые)

Это сообщение отредактировал(а) nikitao - 14.10.2005, 20:05


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
GremlinProg
Дата 14.10.2005, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 3
Всего: 106



Цитата
Хорошо, приведи минимальный работающий пример твоего способа, чтобы я вкурил - о чем ты


Вообще-то мне больше нравится вариант с базовым классом, правда я всё равно не стал бы делать массив указателей, а с моим вариантом, вот, пожалуйста, пример:

Код

class A{
  int field;
  A():field(NULL){}
};

class AA: public A{
  AA(int field):field(field){}
};

class AB: public A{
  AB(double field):field((int)field){}
};

A array[10];

new(array+1)AA(1000);
new(array+2)AB(125.6);

первый и второй члены массива инициированы - по заказу, остальные - по умолчанию.
(все условности опустил, только идея)

Это сообщение отредактировал(а) GremlinProg - 14.10.2005, 20:12


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
LPBOY
Дата 14.10.2005, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Ну как я и говорил, если размер производных классов превышает размер базового, то получаем кашу с инициализацией. Бред...
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Void
Дата 14.10.2005, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(LPBOY @ 14.10.2005, 22:30)
Ну как я и говорил, если размер производных классов превышает размер базового, то получаем кашу с инициализацией. Бред...

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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1376 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.