Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 35 из 87<  1 ... 32  33  34  35  36  37  38 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 24.09.2004
Откуда: Belarus, Mensk
>>вызов геттеров и сеттеров
Тогда уж акцессоров и мутаторов ;)

_________________
ruSpiegel.net - русское зеркало дотнета
Ваши любимые статьи и блоги, посвященные Microsoft .NET Framework, теперь и на русском языке.



Партнер
 

Member
Статус: Не в сети
Регистрация: 24.12.2005
kexman Если ты словами можешь сформулировать, что "племянник" меньше "дяди", то почему не можешь записать это на алгоритмическом языке? :) Ну, а не надо, так и не надо... :)


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Билли Бонс
Не буду грузить ньюансами программы. Я просто был очень рад, что все так легко разрешилось)


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Вопрос:
Определил в программе базовый класс MObject, от которого я наследуюсь. Объектов базового класса не существует в программе.
Все дочерние классы также наследуются плюс ко всему от еще одного класса - GraphicsItem:
Код:
class RectangleItem : public MObject, public GraphicsItem
{
.....
}

Далее в MObject есть один метод, который должен обратиться к методу объекта, унаследованного от GraphicsItem. Как это можно сделать? Ведь сам MObject не знает такого метода. Пользовался операторами преобразования типов(static_cast, const_cast), нифига не получилось:
Код:
void MObject::setData()
{
   GraphicsItem *this_item;
   this_item = const_cast<GraphicsItem *>(this);
   this_item->setVisible(checked);
}

Можно ли как-нибудь это сделать?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Естественно, есть такой паттерн, Template Method называется, если вкратце:
Код:
class MObject
{
protected:
   virtual void setVisible() = 0;
}

class RectangleItem : public MObject, public GraphicsItem
{
protected:
   virtual void setVisible()
   {

   }
}

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Просто это как-то не в стиле ООП получается, в каждом наследнике я должен писать один и тот же код. А так я хотел, чтобы он исполнялся в MObject, и все его наследовали.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman это как раз в стиле, не в стиле, кастать через правое плече и вызывать через левую пятку :D Если тебе этот метод нужен только в GraphicsItem и нигде более, делай ф-цию не чисто виртуальной, а просто виртуальной и с пустой реализацией.

Можно использовать аксесор, можно паттерн Command, можно наконец плюнуть на все и использовать dynamic_cast (а не const_cast) :D
Кстати, что-то мне подсказывает, что ты опять пытаешься изобрести Visitor, как и пару страниц назад.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Daemon писал(а):
можно наконец плюнуть на все и использовать dynamic_cast (а не const_cast)

Но ведь GraphicsItem не является потомком MObject.
Может ты недопонял меня, еще раз попробую объяснить. Все объекты являются потомками MObject и GraphicsItem. Мне нужно из метода MObject::SetData вызвать метод GraphicsItem::SetVisible() для "себя", то есть поскольку объект гарантированно(по логике программы) является потомком GraphicsItem, то к нему можно применить этот метод. Но внутри MObjecta к указателю this нельзя его применить, вот я и хотле как-нибудь перевести MObject *this в GraphicsItem*.
Добавлено спустя 1 минуту, 27 секунд
А может я не понял тебя: Command, Visitor и аксессоры?? Знаю только, что Command применяется для реализации волшебной кнопочки undo.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman ага, слона-то я и не приметил, сейчас подумаю.
Добавлено спустя 5 минут, 32 секунды
Ну короче говоря, я вот подумал и решил, что оптимальнее будет зделать так:
Код:
class MObject
{
protected:
   virtual void callSetVisible() = 0;
};

class FiguresBase : public MObject, public GraphicsItem
{
protected:
   virtual void callSetVisible()
   {
      GraphicsItem::setVisible();
   }
};

class RectangleItem : public FiguresBase
{

};


Эдакая смесь Template Method + элементы Adapter'а :)

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Ага в принципе это то что нужно. Но есть 1 маленький ньюанс - GraphicsItem, а точнее QGraphicsItem - стандартный класс библиотеки QT, он также является абстрактным, базовым классом, у него в библиотеке реализовано множество потомков. И фактически мне надо наследоваться от потомков, а не от него, то есть я хотел так:
Код:
class RectangleItem : public FiguresBase , QGraphicsRectItem
{

};

class EllipseItem : public FiguresBase , QGraphicsEllipseItem
{

};

class TextItem : public FiguresBase , QGraphicsSimpleTextItem
{

};

То есть в библиотеке QT, классы QGraphicsSimpleTextItem, QGraphicsEllipseItem, QGraphicsRectItem наследованы от QGraphicsItem. И тое есть если я унаследую FiguresBase от GraphicsItem, то потомки, которые я только что объявил будут иметь предка QGraphicsItem по обеим линиям, так как например для TextItem:
и FiguresBase и QGraphicsSimpleTextItem имеют предка QGraphicsItem. То есть у меня смешиваются 2 иерархии классов, хочу грамотно это дело разрулить. Так понял, в этих случаях используют виртуальное наследование, но в QT эти классы наследованы от базового невиртуально, поэтому вариант отпадает. Или все-таки придется делать виртуальную функцию в MObject, и реализовывать ее в каждом дочернем классе.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Епт, прям Болливуд какой-то, я твой брат, ты мой сестра и т.д.
Делаем так:
Код:
class MObject
{
protected:
   virtual void callSetVisible() = 0;
};

template<class T>
class FiguresBase : public MObject, public T
{
protected:
   virtual void callSetVisible()
   {
      T::setVisible();
   }
};

class RectangleItem : public FiguresBase<QGraphicsRectItem>
{

};

class EllipseItem : public FiguresBase<QGraphicsEllipseItem>
{

};



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

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
ОО, круто!!! Я бы честно говоря даже и не догадался бы, вообще клевое решение!


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman да без проблем. Тут все просто, так как нужно было набросать взаимодействие пары-тройки классов. Для более комплексных систем, все намного сложнее. Порой читаешь Гамму и просто непонимаешь абзац, и перечитываешь потом пару раз до полного разумения :)

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon Я честно говоря когда столкнулся с этой проблемой, у меня возникло такое ощущение, что она нерешаема в рамках С++. А оказывается можно все!
Еще раз напомни плиз, че такое Гамма? Сегодня пойду покупать печатную книжку по проектированию, посоветуй пожалуйста, что лучше. Знаю такие книги:
Саттер - не понял какие у него книги - есть exceptional/more exceptional c++, есть Решение сложных задач.
Александреску - Современное проектирование на C++.
GOF - приемы ООП - паттерны проектирования.
Гради Буч - Объектно-ориентированный анализ и проектирование
Скотт Мейерс - Эффективный код.
Мартин Фаулер - Рефакторинг.

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


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman Эрих Гамма, это похоже главный, из ГОФа. Покупай ГОФ, остальные книги тоже отличные, но они немного не подходят. А в рамках С++ решаемо все, потому как если даже нет стандартных инструментов, в плюсах всегда есть куча хаков :D

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Читаю сейчас на досуге про C#, интересно почему нельзя также ввести в стандарт C++ те же самые свойства? Это же удобно. Плюс еще почитаю про интерфейсы - что это такое, и чем отличается от множественного наследования.
Какое у C# преимущество, как я понимаю, его разрабатывали, не ставя себе цель обеспечить совместимость с каким-либо языком прошлого поколения, а пыталиь брать лучшее из каждого языка.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman писал(а):
Читаю сейчас на досуге про C#, интересно почему нельзя также ввести в стандарт C++ те же самые свойства? Это же удобно. Плюс еще почитаю про интерфейсы - что это такое, и чем отличается от множественного наследования.
Свойства - с одной стороны удобно, а с другой стороны не очень. Потом попробуй разобрать, это обращение к члену класса или к свойству, запутывает. Хотя конечно с этим должна справляется IDE, но VS увы пока этого не имеет. А касательно интерфейсов и множественного наследования, да не помешало бы кое-что поменять. Но с другой стороны, уже столько кода написано, и множественное наследование компенсирует отсутствие интерфейсов.

kexman писал(а):
Какое у C# преимущество, как я понимаю, его разрабатывали, не ставя себе цель обеспечить совместимость с каким-либо языком прошлого поколения, а пыталиь брать лучшее из каждого языка.
Это все субъективно. Над C# работал человек, который в свое время работал над Delphi, и такое впечатление, что шарп от-туда много подчерпнул, те же свойства. Я на досуге читаю Python.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Ну этот же человек в свое время написал turbo pascal - знаковая вещь как мне кажется. http://ru.wikipedia.org/wiki/Turbo_Pascal . Кто не использовал турбо паскаль? :) Я даже определенную симпатию к нему испытываю сейчас :)
Думаю тоже какой-нибудь прикольный язык начать осваивать, типа Python или Hascell(не знаю как пишется). Думаю интересно.
Вопрос есть, как к профессионалу, можно ли научиться программированию, не имея специального образования? Я вот кроме в школе и первых двух курсов в универе учился совсем не связанным с программированием вещам. Что для этого нужно? Сейчас пишу алгоритм, построения линий равных высот, по сетке(матрице) данных. Имею исходники реализации этого в другой программе, так там 550 строк, против моих 170. Вот и думаю, в каком направлении двигаться, что изучать. Математику? Если да то какой ее раздел? Или еще что-то? Кнута штудировать? ООП - это ведь только одна сторона. А ведь еще есть технологии всякие, их полно, хотя мне для прикладухи может и не понадобиться.

Добавлено спустя 33 минуты, 23 секунды
короче ходил в 2 магазина. По проектированию книг нет.
Очень понравилась книжка по С++ нашего автора, тоненькая такая, страниц 200-250. Называется Самоучитель с++. На обложке написано, привожу почти дословно:
Цитата:
Прочитав эту книгу вы:
-поймете что такое программирование
-изучите язык программирования с++
-поймете концепцию ООП
-подготовите себя к переходу к Java и C#

Я в шоке был :shock:


 

Заблокирован
Заблокирован
Статус: Не в сети
Регистрация: 26.07.2006
Есть класс:
class sc
{
private:
int i;
public:
operator int (){return i;}
operator char (){return 'r';}
};
Как избежать ambiguity если нужно и преобразование и в инт и в чар?


 

Member
Статус: Не в сети
Регистрация: 24.09.2004
Откуда: Belarus, Mensk
>>почему нельзя также ввести в стандарт C++ те же самые свойства? Это же удобно.

Использую свойства только тогда, когда нужно пользователю предоставить интерфейс для настройки в VS IDE. Явные методы (а CLR не знает про свойства, такое понятие существует только на уровне метаданных, которые объединяют два метода get_*** и set_*** в единую сущность) обеспечивают лучшую читаемость и понимание, что вызывается именно метод (т.е. это все не бесплатно, а то находятся товарищи, которые не кэшируют значение свойства и вызывают тяжелые операции по несколько раз в одном куске кода, хотя значение при этом не изменяется).

>>чем отличается от множественного наследования.

В C# различают два вида наследования: наследование реализации и наследование контракта. В принципе роль интерфейса может выполнять и абстрактный класс, но т.к. CLR не поддерживает множественного наследования для классов (и правильно), то ввели понятие интерфейса (в принципе, это тоже класс - CLR [не C#] даже позволяет использовать для него конструктор, но он "равнее", чем остальные).

>>По проектированию книг нет.

Зато в интернете навалом :) Особенно на английском.

>>Я в шоке был

Вполне себе нормальное описание. C++ без STL - реально в 250 страниц уместить при этом демонстрируя основы ООП.

>>Кнута штудировать?

Есть такая замечательная книга "Алгоритмы на С++". Много понятнее Кнута. К тому же готовые реализации на C++ имеются.

>>Как избежать ambiguity если нужно и преобразование и в инт и в чар?

А ты каким компилятором компилируешь? У меня VC++ 2005. Неоднозначностей нету. В любом случае можешь попробовать создать методы типа ToInt() и ToChar().

_________________
ruSpiegel.net - русское зеркало дотнета
Ваши любимые статьи и блоги, посвященные Microsoft .NET Framework, теперь и на русском языке.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 35 из 87<  1 ... 32  33  34  35  36  37  38 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan