Здравствуйте, Sheridan, Вы писали:
C>>>4. Приложения для систем без .NET Framework. Д>>а ты сможешь написать прогу на С++ для системы, в которой нет компилятора С++? S>Некорректное сравнение.
C>>>6. Кросс-платформенные приложения (не надо про Mono). Д>>а почему это вдруг не надо? Чтобы не разрушать твою стройную систему доказательств? S>Нет. Потомучто уродец. Впрочем как и папа...
Vermicious Knid wrote: > Я как бы в курсе, хотя уже где-то год прошел с тех пор как я их > последний раз применял(да и вообще C++).Действительно абстрактные классы > есть, но ведь ограничений скажем так несколько больше чем в C#. Например > в конструкторе Base::Base ты вызвать squaсk не сможешь. Плюс в C# можно > объявить еще и абстрактное свойство, не только метод.
А в C# уже есть деструкторы?
В конструкторе я вызвать squack тоже могу при желании (хотя, хотя какой
в этом смысл)?
> Да и объективно говоря C++ даже исходя из синтаксиса объявления > "абстрактных" классов не может претендовать на более высокий уровень > поддержки этой возможности.
В чем оно кардинально от C# отличается? Или слово "abstract" делает язык
более высокоуровневым?
> C>2. Интерфейсы: > Это фикция. Это те же абстрактные классы, а не интерфейсы(только не надо > сюда приплетать множественное наследование). Те же самые ограничение > плюс совершенно другая смысловая нагрузка. Для интерфейсов в нормальном > языке существуют определенные правила, которые не должны нарушаться. В > C++ это как всегда исключительно вопрос самодисциплины.
И что?
Я не вижу проблем с программированием на С++ в стиле C#/Java — куча
библиотек так работает (начиная с COM). C# будет "посахаристее", но
кардинально ничего не добавляет.
> Опять фикция. На этот раз еще большая. На практике в C++ такой подход > никто не применяет. Если кто-то применяет, могу только посочувствовать.
Это значит, что просто никому особо не надо. Тем более, что в C#
свойства — это просто сахар над get-,set- функциями и не добавляет
ничего семантически нового.
Здравствуйте, Дарней, Вы писали:
Д>Как там RSDN@Linux поживает?
Если мне дадут "псевдосервер" rsdn (чтобы xml синхронизации отдавал) то как сеточку дома подниму между новым и старым компом то начну девелопить. А то и сам напишу этот псевдоrsdn... Инета то дома нету...
Здравствуйте, alexeiz, Вы писали:
A>Не можешь отличить private от protected?
Ну ты же просил что-то подобное. На мой взгляд protected вполне удовлетворяет этому определению, в той или иной степени. Инкапсуляция это хорошо, но не стоит ей черезмерно увлекаться. На мой взгляд то безобразие, что творится в C++ с разными видами наследования и друзьями в хорошо-спроектированном языке ни к чему.
И вообще более продуктивно искать возможность сделать что-то, чем искать возможность не делать. Сказать, "ах этот поганный C# не позволяет делать абстрактные методы приватными, да ну его к черту!", — это слишком легко и как минимум глупо.
А если конкретно о private методах, то мне вот например почему-то не приходила мысль, что это может быть полезно, хотя абстрактные классы использую постоянно.
Vermicious Knid wrote: > Ну ты же просил что-то *подобное*. На мой взгляд protected вполне > удовлетворяет этому определению, в той или иной степени.
Ну так кто мешает его поставить?
> И вообще более продуктивно искать возможность сделать что-то, чем искать > возможность не делать. Сказать, "ах этот поганный C# не позволяет делать > абстрактные методы приватными, да ну его к черту!", — это слишком легко > и как минимум глупо.
В С++ приватные виртуальные методы помогают документированию: http://www.cuj.com/documents/s=8000/cujcexp1812hyslop/hyslop.htm
> А если конкретно о private методах, то мне вот например почему-то не > приходила мысль, что это может быть полезно, хотя абстрактные классы > использую постоянно.
Учите С++.
Здравствуйте, Vermicious Knid, Вы писали:
VK>Здравствуйте, alexeiz, Вы писали:
A>>Не можешь отличить private от protected?
VK>Ну ты же просил что-то подобное. На мой взгляд protected вполне удовлетворяет этому определению, в той или иной степени. Инкапсуляция это хорошо, но не стоит ей черезмерно увлекаться.
Дело в том, что на C# выразить инкапсуляцию в полной мере не удаётся. По твоей логике, раз нельзя, значит и не надо увлекаться.
> На мой взгляд то безобразие, что творится в C++ с разными видами наследования и друзьями в хорошо-спроектированном языке ни к чему.
Не спеши с выводами. CLI использует разные модели доступа к членам класса внутри и извне модуля. Какое безобразие можно сотворить с комбинациями public private, internal public, private protected и т.д., наверное, несравнимо с друзьями (тем не менее друзей таким способом нельзя реализовать). В данном случае нужно говорить не о хорошо/плохо спроектированном языке, а о гранулярности контроля над его поведением.
VK>И вообще более продуктивно искать возможность сделать что-то, чем искать возможность не делать. Сказать, "ах этот поганный C# не позволяет делать абстрактные методы приватными, да ну его к черту!", — это слишком легко и как минимум глупо.
Когда стоит выбор между двумя языками, ты выберешь тот, который даёт тебе больший контроль и гибкость или меньший?
VK>А если конкретно о private методах, то мне вот например почему-то не приходила мысль, что это может быть полезно, хотя абстрактные классы использую постоянно.
Давно известная идея в C++. В мир C# она только-только приходит. Но только она не может быть реализована в полной мере. Эта ситуация характерна для C#. Многие полезные идеи из C++ не имеют (или имеют ограниченное) в нём представления.
Это не валидный код и не рабочий пример, учите C++.
Во-первых отсутствует точка с запятой после объявления класса(очередной маразм C++).
Во-вторых если считать первое опечаткой и добавить собственно код:
#include <iostream>
struct Base
{
Base() { do_squack(); }
void squack() { do_squack(); }
protected:
virtual void do_squack()=0;
};
struct Derived : Base
{
protected:
virtual void do_squack()
{
std::cout<<"squack!";
}
};
int main()
{
Base * base = new Derived();
}
gcc, и msvc7.1 его компилировать отказались(msvc7.1 просто не слинковал, gcc не понравился вызов do_squack в конструкторе). comeau online справедливо выдал warning.
Грязным хаком оказалось следующее(lol):
// .. код поскипан
Base()
{
squack();
}
В результате как и следовало ожидать имеем runtime-error "pure virtual method called" в обоих случаях. О результате этого эксперимента я знал зараннее, просто потому, что таков механизм работы виртуальных функций 99% известных мне реализаций C++.
В C# такой код почему-то считается штатной ситуацией и нормально работает. Зачем — это уже третий вопрос, но мне однажды это пригодилось.
Здравствуйте, alexeiz, Вы писали:
A>Все примены из Nemerle идут лесом. Сравнивать C++ с функциональным языком, это слоны и бегемоты. Подумай тот ли язык программирования ты выбрал, если тебе приходится писать функциональный код. Здесь идет сравнение с C# — основным языком программирования для .NET.
1. Тебя дезинформировали, Nemerle — не функциональный язык. Оба примера можно реализовать на C# так же кратко, с тем исключением, что придётся явно указать типы аргументов и переменных (т.к. выводить он их не умеет). Так что эти примеры остаются в силе.
2. Функциональное и императивное программирование не взаимоисключают друг друга, а дополняют. Очень многие куски кода становятся в разы короче. Тот же STL в С++ использует функциональный стиль для алгоритмов, но из-за отсутствия поддержки замыканий компиляторами, это разочаровывает не меньше, чем даёт выгоды. Никуда ты от темы ФП не денешься, т.к. в ФП есть очень и очень полезные вещи, которые сейчас появляются в других не-функциональных языках как грибы.
3. В указанных мной примерах не ни одного элемента, свойственных лишь функциональным языкам. Вообще тему о ФЯ ты поднял не к месту. Я лишь продемонстрировал, что такое замыкания, и что в C++ их нет и эмулировать никакими ухищрениями в принципе нельзя. Зато замыкания есть в других (императивных) языках, к примеру, в Python.
Жду реализации Sort более краткой и понятной, чем это сделано с использованием элементов функционального программирования.
A>Опять в том же стиле. Ты не понимаешь о чём речь. Никто не пытается сказать, что всё можно сделать на C++ (легко).
Тебе показали, что уровень абстракции может быть выше, и есть языки, где это можно вовсю использовать. В т.ч. императивные.
A>А, вот что ты имел ввиду в своем коде. Абсолютно бредовый код, честно говоря.
Давай лучший код. Задача повседневная, с сотнями решений — сортировать матрицу строк по значениям в столбце, по возрастанию или по убыванию. Для каждого listview-контрола с сортировкой она решена. Просто попробуй привести решение без замыканий, лучшее, чем с ними.
Кё>>Факт в том, что в других языках есть нужные и полезные возможности, которых в С++ нет. A>Где?
Что где? Где рефлешн без изменения синтаксиса объявлений и привлечения DDL? Где замыкания? Там, в документации. А если вспомнить, что Nemerle прочат в C# 4.0, то тут нельзя не упомянуть метапрограммирование с ествественным синтаксисом, вывод типов, функциональные типы, pattern matching.
Vermicious Knid wrote: > C>С точностью до синтаксиса. > Это не валидный код и не рабочий пример, *учите C++*.
Код валидный. Будет вполне нормальный pure virtual call.
> Во-первых отсутствует точка с запятой после объявления класса(очередной > маразм C++).
А кто сказал, что код завершен?
> gcc, и msvc7.1 его компилировать отказались(msvc7.1 просто не слинковал, > gcc не понравился вызов do_squack в конструкторе). comeau online > справедливо выдал warning.
Gcc 4.0.2 скомпилировал и предупреждением. При запуске — справедливый
pure virtual call.
Здравствуйте, Cyberax, Вы писали:
C>Это значит, что просто никому особо не надо. Тем более, что в C# C>свойства — это просто сахар над get-,set- функциями и не добавляет C>ничего семантически нового.
Здравствуйте, alexeiz, Вы писали:
A>Но C++ — это язык не для новичка. Про новичков вопрос отдельный. C++ в настоящее время больше ориентирован на профессионалов.
Жаль что эти профессионалы часто путают привычность с понятностью и читабельностью, наличие фичи в языке с возможностью решать те же задачи другими средствами (или с возможностью сделать кривую эмуляцию), и пытаются писать на новых языках как на известным им. А ещё небрежно бросают "а что вы хотели, С++ ведь надо изучать", абсолютно не обращая внимание, что на это надо минимум год в режиме полного рабочего дня в проекте, где будут возникать разноплановые задачи, и что перспективы такой траты времени всё более и более сомнительны.
Здравствуйте, Sheridan, Вы писали:
S>Здравствуйте, Дарней, Вы писали:
Д>>Как там RSDN@Linux поживает?
S>Если мне дадут "псевдосервер" rsdn (чтобы xml синхронизации отдавал) то как сеточку дома подниму между новым и старым компом то начну девелопить. А то и сам напишу этот псевдоrsdn... Инета то дома нету...
Давай-давай, я даже посодействовать могу. Очень хотел бы видеть такое под Линуксом.