Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 136 137 [138] 139 140 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2056
,
|
|
|
|
Обажаю спирит Он еще и компилируется не хило так...Но с другой стороны, лучше spirit пока ничего нет. Добавлено Цитата trainer @ Ну да, в C++ возможны очень сложные шаблоны. Программист использует их только и исключительно по собственном желанию и добровольно соглашается на возможные сложности при компиляции/отладке. Вопрос в том, зачем разработчики boost'а ТАК используют шаблоны, всегда ли это оправдано, и что можно сказать о таком языке, в котором для реализации некоторых вещей просто необходимо прибегать к такому монстрообразному коду... |
|
Сообщ.
#2057
,
|
|
|
|
вот еще небольшой вброс от одного товарища:
Цитата Цитата Класс состоящий только из виртуальных функций фактически является аналогом интерфейса в таких языках как C# или Java чушь. отнаследуйся от двух "классов, состоящих только из (чисто) виртуальных функций", имеющих совпадающие сигнатуры, и убедись, что интерфейсов в C++ нет (не было и не будет) -- а в чем подвох? |
|
Сообщ.
#2058
,
|
|
|
|
korvin, то, что интерфейсов в С++ нет говорилось уже неоднократно. Другое дело, что если в языке есть множественное наследование и абстрактные классы, то интерфейсы и не нужны, по крайней мере такие, какие они в C#, Java и Delphi.
|
|
Сообщ.
#2059
,
|
|
|
|
Цитата D_KEY @ korvin, то, что интерфейсов в С++ нет говорилось уже неоднократно. Другое дело, что если в языке есть множественное наследование и абстрактные классы, то интерфейсы и не нужны, по крайней мере такие, какие они в C#, Java и Delphi. ты не прочитал вторую цитату: =) |
|
Сообщ.
#2060
,
|
|
|
|
![]() ![]() class IA { public: virtual void f() = 0; }; class IB : virtual public IA { public: virtual void g() = 0; }; class A : virtual public IA { public: virtual void f() {} }; class B : public A, public IB { public: virtual void g() {} }; int main() { B b; b.f(); b.g(); return 0; } |
|
Сообщ.
#2061
,
|
|
|
|
Цитата D_KEY @ можно сказать то, что в нем можно сделать то, чего первоначально не предполагалось. что можно сказать о таком языке, в котором для реализации некоторых вещей просто необходимо прибегать к такому монстрообразному коду... Добавлено Цитата D_KEY @ Странно слышать от тебя такой вопрос. Очевидно чтобы перенести максимум работы на стадию компиляции. зачем разработчики boost'а ТАК используют шаблоны |
|
Сообщ.
#2062
,
|
|
|
|
Цитата korvin @ вот еще небольшой вброс от одного товарища: Цитата Цитата Класс состоящий только из виртуальных функций фактически является аналогом интерфейса в таких языках как C# или Java чушь. отнаследуйся от двух "классов, состоящих только из (чисто) виртуальных функций", имеющих совпадающие сигнатуры, и убедись, что интерфейсов в C++ нет (не было и не будет) -- а в чем подвох? Боянистый вброс. На сколько помню D&E и Саттера (и ни с чем не путаю), это даже обсуждалось на комитете. Там же выяснилось, что всё легко решается. ![]() ![]() #include <iostream> class Interface1 { Interface1(const Interface1&); Interface1& operator= (const Interface1&); public: Interface1() {} virtual void f() = 0; virtual ~Interface1() {} }; class Interface2 { Interface2(const Interface2&); Interface2& operator= (const Interface2&); public: Interface2() {} virtual void f() = 0; virtual ~Interface2() {} }; class Interface1_f : public Interface1 { void f() { iface1_f(); } public: virtual void iface1_f() = 0; }; class Interface2_f : public Interface2 { void f() { iface2_f(); } public: virtual void iface2_f() = 0; }; class A : public Interface1_f, public Interface2_f { public: void iface1_f() { std::cout << "Interface1::f()" << std::endl; } void iface2_f() { std::cout << "Interface2::f()" << std::endl; } }; void f1(Interface1& iface) { iface.f(); } void f2(Interface2& iface) { iface.f(); } int main() { A a; f1(a); f2(a); } |
|
Сообщ.
#2063
,
|
|
|
|
Цитата trainer @ можно сказать то, что в нем можно сделать то, чего первоначально не предполагалось. макросистемы CL и Scheme тоже это позволяют, но без таких многоэтажных полотен =) или ближе к теме возьмем те же дженерики C#/Delphi Цитата trainer @ Странно слышать от тебя такой вопрос. Очевидно чтобы перенести максимум работы на стадию компиляции. не так уж и много работы выполняют шаблоны на этапе компиляции =) Добавлено Цитата Повстанець @ ![]() ![]() class IA { public: virtual void f() = 0; }; class IB : virtual public IA { public: virtual void g() = 0; }; class A : virtual public IA { public: virtual void f() {} }; class B : public A, public IB { public: virtual void g() {} }; int main() { B b; b.f(); b.g(); return 0; } да-да, виртуальное наследование уже обсудили... костыли и подпорки =) хотя можно было просто одно ключевое слово interface ввести вместо десятка разнообразных комбинаций virtual и прочего =) Цитата виртуальное наследование интерфейсов смысла не имеет, и как раз хорошо показывает тот факт, что чисто абстрактные классы в C++ - это именно чисто абстрактные классы, и ничего более |
|
Сообщ.
#2064
,
|
|
|
|
Цитата korvin @ Зачем в языке со множественным наследованием интерфейс? да-да, виртуальное наследование уже обсудили... костыли и подпорки =) хотя можно было просто одно ключевое слово interface ввести вместо десятка разнообразных комбинаций virtual и прочего =) |
|
Сообщ.
#2065
,
|
|
|
|
Цитата MyNameIsIgor @ Боянистый вброс. На сколько помню D&E и Саттера (и ни с чем не путаю), это даже обсуждалось на комитете. Там же выяснилось, что всё легко решается. ![]() ![]() #include <iostream> class Interface1 { Interface1(const Interface1&); Interface1& operator= (const Interface1&); public: Interface1() {} virtual void f() = 0; virtual ~Interface1() {} }; class Interface2 { Interface2(const Interface2&); Interface2& operator= (const Interface2&); public: Interface2() {} virtual void f() = 0; virtual ~Interface2() {} }; class Interface1_f : public Interface1 { void f() { iface1_f(); } public: virtual void iface1_f() = 0; }; class Interface2_f : public Interface2 { void f() { iface2_f(); } public: virtual void iface2_f() = 0; }; class A : public Interface1_f, public Interface2_f { public: void iface1_f() { std::cout << "Interface1::f()" << std::endl; } void iface2_f() { std::cout << "Interface2::f()" << std::endl; } }; void f1(Interface1& iface) { iface.f(); } void f2(Interface2& iface) { iface.f(); } int main() { A a; f1(a); f2(a); } _это_ называется _легко_ решается? ну ладно... |
|
Сообщ.
#2066
,
|
|
|
|
Цитата korvin @ или ближе к теме возьмем те же дженерики C#/Delphi Эммм... А что дженерики? Они чем-то так немерянно круты? Цитата korvin @ не так уж и много работы выполняют шаблоны на этапе компиляции =) Вы пытаетесь оперировать абсолютными величинами? Если всё сравнивать с чем-то аналогичным, конечно, если у нас есть возможность исполнения кода на этапе компиляции, то это гораздо круче. Но всё же очевидно, что шаблоны выполняют больше работы, чем те же дженерики. |
|
Сообщ.
#2067
,
|
|
|
|
Цитата Повстанець @ Зачем в языке со множественным наследованием интерфейс? а зачем виртуальное наследование? Вы же интерфейс от класса отличаете? |
|
Сообщ.
#2068
,
|
|
|
|
Цитата korvin @ _это_ называется _легко_ решается? ну ладно... А что, ниасилили? |
|
Сообщ.
#2069
,
|
|
|
|
Цитата MyNameIsIgor @ Эммм... А что дженерики? Они чем-то так немерянно круты? нет, но их дебажить значительно легче Добавлено Цитата MyNameIsIgor @ А что, ниасилили? ![]() а зачем эту кучу мусора асиливать? =) Добавлено Цитата MyNameIsIgor @ шаблоны выполняют больше работы, чем те же дженерики. с этим я и не спорил никогда. но ничего фантастического шаблоны не делают. |
|
Сообщ.
#2070
,
|
|
|
|
Цитата korvin @ нет Именно, ничего в них хорошего. Цитата korvin @ но их дебажить значительно легче И много вы дебажили шаблонов? Цитата korvin @ а зачем эту кучу мусора асиливать? =) Ну, я же осиливал эту кучу мусора от криворукого кодера. Почему бы вам не ответить мне тем же? Или вам Добавлено Цитата korvin @ с этим я и не спорил никогда. но ничего фантастического шаблоны не делают. Да Боже упаси утверждать, что они делают фантастическое. Просто они делают достаточно, чтобы во многом облегчить жизнь программиста на C++. |