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

Поиск:

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


Днепрянин
****


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

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



Допустим, есть класс A. Этой мой класс, не производный от какого-то другого.

Есть два класса:

AA : public A
AB : public A

классы AA и AB отличаются друг от друга (да и от класса A) только конструктором, а если точнее, то инициализацией одной константы.

Мне нужно сделать массив, чтоб элементы массива - объекты классов AA и AB. Заранее неизвестно, какой элемент соотв какому классу.

Как это сделать? В каком месте вызывать конструктор? Это вообще возможно?

З.Ы. Я не пишу, как я пытался делать, потому что это скорее всего бред.


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Darhazer
Дата 14.10.2005, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 28.9.2005
Где: HellCity (Sofia, Bulgaria)

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



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

2) А нужно ли три класа чтоб проинициализировать одну константу с различним значениях?


--------------------
I'm a wheel, I'm a wheel, I can roll, I can feel
But you can't stop me turning
'Cause I'm the sun, I'm the sun, I can move, I can run
But you'll never stom me burning
PM MAIL WWW ICQ YIM   Вверх
nikitao
Дата 14.10.2005, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Fedor,Честно гворя плохо тебя понял,но если все таки понял то:
Надо обьявить массив указателей на базовый класс A,а потом с помощью new создавать классы птомки AA и AB.У них будут вызываться нужные конструкторы.



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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



без проблем. так и вызывай:
array[0] = new AA(1);
array[1] = new AB(2);
( я предполагаю что у тебя массив указателей, но можно и без них: array[0] = AA(1);)


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
srd
Дата 14.10.2005, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

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



Цитата(_hunter @ 15.10.2005, 00:11)
( я предполагаю что у тебя массив указателей, но можно и без них: array[0] = AA(1);)

Нельзя. Только массив указателей на базовый класс.

P.S.
Чуть не написал массив ссылок, но это разумеется бред.

Это сообщение отредактировал(а) srd - 14.10.2005, 16:26


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
nikitao
Дата 14.10.2005, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата
Чуть не написал массив ссылок, но это разумеется бред.

Если не ошибаюсь это теоретически возможно,только всякого смысла лишено. smile


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


Бывалый
*


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

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



Цитата(nikitao @ 14.10.2005, 16:29)
Если не ошибаюсь это теоретически возможно,только всякого смысла лишено.

Почему? smile Как раз это теоретически не возможно, но ИМХО смысл в этом мог бы быть.
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Mad
Дата 14.10.2005, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(LPBOY @ 14.10.2005, 15:54)
Как раз это теоретически не возможно

Это возможно и теоритически и практически
Код

class A
{
    A();
}

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

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

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

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


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


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


λcat.lolcat
****


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

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



Mad
И в итоге имеем срезку...

Массивы ссылок действительно явно запрещены в стандарте.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
srd
Дата 14.10.2005, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

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



Цитата
A array[10];

Это не массив ссылок. Массива ссылок в Си++ нет.

Цитата

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

Тут будет скопирован подобъект A, а AA- и AB-части будут утеряны. Не уверен, что это то, что надо автору топика. Обычно это ошибочный код.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
LPBOY
Дата 14.10.2005, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Mad @ 14.10.2005, 18:02)
Это возможно и теоритически и практически

Да ты что! smile Твой пример конечно познавательный, но я не понял при чем он здесь? Покажи как создать массив ссылок.
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Mad
Дата 14.10.2005, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(srd @ 14.10.2005, 17:11)
Тут будет скопирован подобъект A, а AA- и AB-части будут утеряны

естественно, ведь непосредсвено обьект можно нормально хранить только по указателю
а если ты (даже в массив указателей) будеш ложить обьекты разных классов, то доступ будет только к общим членнам классов (т.е к элементам родтиельского класса).
А преведенный выше код был только к этой фразе smile
Цитата(LPBOY @ 14.10.2005, 15:54)
Как раз это теоретически не возможно


Добавлено @ 18:28
Цитата(LPBOY @ 14.10.2005, 17:13)
Покажи как создать массив ссылок

что ты подразумеваеш под ссылкой (в С++ есть обьект класса и есть указатель на обьект класса) ?


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


Бывалый
*


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

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



Цитата(Mad @ 14.10.2005, 18:27)
что ты подразумеваеш под ссылкой (в С++ есть обьект класса и есть указатель на обьект класса) ?

Но только по секрету! Еще там есть ссылка на объект класса.
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
nikitao
Дата 14.10.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата
но ИМХО смысл в этом мог бы быть.

Приведи пример(сам че то я не догоняю).Насколько мне говорили,что независимые ссылки(а мы пытаемя создать из них массив )лишены всякого смысла(в практическом плане),хотя их можно создавать.


Да ,а практически это не возможно т к независимые ссылки должны инициализироваться при их создании а это в массиве(в данном точно) не возможно.Полный список ограничений на ссылки любого типа(согласно Standart С++):
[*]Нельзя ссылаться на другую ссылку
[*]Нельзя получать адрес ссылки
[*]Нельзя создавать массивы ссылок
[*]Нельзя ссылаться на битовые поля
[*]Ссылка должна быть иниц. до того как станет членом класс ,возвратить значение ф-ции или стать ее параметром


ЗЫ Взято из С++ от Шилдта. smile

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


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


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

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



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

Ну и что? Сами-то объекты никуда не делись. Виртуальные функции, в крайнем случае - dynamic_cast<>() помогут.




--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0693 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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