LINUX.ORG.RU

[C++] Массив разных классов и массив ссылок на разные классы

 


0

0

Есть класс Rectangle (прямоугольник). У него есть размеры по x и y и координаты центра.

Наследованием созданы классы ColoredRectangle (цветной прямоугольник) и PatternedRectangle (прямоугольник с текстурой). У обоих есть функции Draw(), рисующие их.

Надо сделать массив (желательно, vector) rectangleMass, содержащий как цветные, так и текстурированные прямоугольники, чтобы потом пройтись по нему, вызывая для каждого элемента Draw. Также нужен массив (опять же, желательно vector), содержащий указатели на некоторые элементы из rectangleMass.

Это возможно?

★★★★★

Последнее исправление: Obey-Kun (всего исправлений: 1)
Ответ на: комментарий от staseg

>2. virtual void SetColor(){}. Объявление отдельно, реализация отдельно.

Бред читой воды.

Если не трудно, то объясните в чем «бредовость» раздельного объявления и реализации методов.

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

Если не трудно, то объясните в чем «бредовость» раздельного объявления и реализации методов.

В том, что делать это лишь ради сферческой идеи - глупость. Это точно так же как не использовать goto от того, что все говорят, что это плохо.

Если метод заведомо пустой (потому что трехэтажные интерфейсы любят не все) или делает что-то вовсе незначительное, что наверняка ни в ближайшее время, ни вообще когда-либо никак не изменится, то почему нет?

virtual void someStuff(){} // пустой

int isReady()const{ // тривиальный
return this->ready;
}
staseg ★★★★★
()
Ответ на: комментарий от lester

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

Расширяемость не нужна, т.к. матмодель вполне определённая. А скорость важна, т.к. эта модель пишется на замену старой и тормозной.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от lester

а зачем тут делать указатель на элемент вектора? копируешь указатель на сам объект и все

У меня это так реализовано (пока без всяких virtual функций, пока с базовым классом экспериментирую):

class Cell
{
    vector<NearCell> nearCells;
    struct NearCell
    {
        Cell *cellPointer;
        double contactArea;		//площадь контакта
        short axe;			//по какой оси (x,y,z)
    };
    vector<double> dimensions;	//массив размеров ячейки по осям (r)
    double volume;		//объём (ν)
public:
    ...
};

нормально?

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от lester

> а ООП тут точно надо?

Да, т.к. мне нужен опыт ООП. Потом будет писаться похожая модель, где ООП точно понадобится.

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

это аналог dynamic_cast с похожей записью:

I_Connection* pConn = QI( pObj, I_Connection );

но оно пока тебе не надо

lester ★★★★
()

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

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

Но блин, про виртуальные деструкторы то забывать не нужно, это в любом случае длинные грабли. Впрочем если компилить с -wall -werror то такие ошибки не допустишь

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

> лень уже придираться :) ( ушел спать )

спокойной ночи, попридирайся потом плз)

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от dimon555

>по ссылке COM, это точно работает под линуксом?
В wine запросто.

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

>vector<shared_ptr<Rectangle> > recv_arr;

Плохо, что надо тащить Boost. И все равно надо быть осторожным, так как «подводные камни» остаются.

pathfinder ★★★★
()

Я бы вынес метод Draw() в отдельный интерфейс IDrawable и унаследовал Reactangle от него.

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

Плохо, что надо тащить Boost

ну напиши свой shared_ptr, или пользуй tr1

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

> по ссылке COM, это точно работает под линуксом?

по ссылке описан принцип - а его реализация никак не отличается, что в виндовс, что в линукс

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