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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Давайте обсудим недостатки и недочёты С++, недостатки языка 
:(
    Опции темы
Vyacheslav
Дата 18.11.2003, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Небольшая информация. Трехгодичный мораторий на внесение измений стандарта окончился и сейчас идет работа по внесению изменений. Информацию о текущем положении дел можно подчерпнуть отсюда
http://std.dkuug.dk/jtc1/sc22/wg21/docs/pa...402.html#hickey
http://www.cuj.com/documents/s=8890/cujexp0310sutter/
http://www.cuj.com/documents/cujcexp0308sutter/

Лично меня порадовало внесение в стандарт(пока в черновной вариант) шаблонного класса function, в частности облегчающего работа с указателями на метод класса
Например.
Код

string AppendA( string s ) { return s + 'a'; }

class B {
public:
 virtual string AppendB( string s ) { return s + 'b'; }
};

class Derived : public B {
 string AppendB( string s ) { return s + "bDerived"; }
};

class Name {
public:
 Name( string s ) : s_( s ) { }
 string Get() const { return s_; }

private:
 string s_;
};

const char* AppendD( const Name& s ) {
 static string x;
 x = s.Get() + 'd';
 return x.c_str();
}


string test = "test";
B b;
Derived der;

function<string (string)> f;  
                                                             
f = &AppendA;                                
cout << f( test ) << endl;

f = bind1st( mem_fun( &B::AppendB ), &b );
cout << f( test ) << endl;
f = bind1st( mem_fun( &B::AppendB ), &der );
cout << f( test ) << endl;                    

f = c;                                        
cout << f( test ) << endl;

f = &AppendD;                                
cout << f( test ) << endl;    


Замена __closure от Borland выглядела примерно так
Код

//typedef void  (__closure * TNotifyEvent)(TObject* Sender);

typedef function< void(TObject*) > TNotifyEvent;
...
void TForm1::Button1Click(TObject* Sender)
{
...
}

void Click(TObject* Sender)
{
...
}

//Button1->OnClick = Button1Click;
Button1->OnClick = bind1st( mem_fun( &TForm1::Button1Click ), this );
//Button1->OnClick = Form2->Button1Click;
Button1->OnClick = bind1st( mem_fun( &TForm2::Button1Click ), Form2 );

//а вот этого closure не мог
Button1->OnClick = &Click;








--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
BuBu
Дата 20.11.2003, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Fantasist BRAVO:) I krome vsego vi je sebe predstavljajete chto napisannij kod doljen kto-to i chitat`, i po semu kak vi sebe predstavljajete ser`jeznie (imeetsja v vidu razmer koda) swich, if i drugie s bol`shim kolichestvom break-ov ili continue-ov, nu tut i zrenie isportit` mojno:) GOD BLESS C++ jazik v kotorij sam je sposoben ispravit` vse svoi nedostaki:)
PM MAIL   Вверх
sergejzr
Дата 10.4.2004, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Не могу сказать, что существует много недостатков, но пару предложений появляются, когда сравниваешь Си++ с другими языками. Например:
  • JAVA: если функция кидает Exception, то она должна быть соответственно задекларирована.
    Если юзер вызывает такую функцию, он ОБЯЗАН работать с try catch. К сожалению в Си++ это не так sad.gif Хотим кидаем хотим ловим.
  • Хотелось бы иметь возможность работать с ММХ и расширениями SSE.
  • Неплохо было бы иметь возможность указывать операции, которые могут выполняться параллельно. Как например в VHDL (хотя конечно назначение VHDL другое).
Пока всё...


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
p0s0l
Дата 10.4.2004, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Цитата
Если юзер вызывает такую функцию, он ОБЯЗАН работать с try catch. К сожалению в Си++ это не так  Хотим кидаем хотим ловим.

Не вижу недостатка в этом. Это даже к лучшему.
Например, вызываю функцию 1 (при этом она в try..catch), та в свою очередь использует сотни функций, каждая из них может выкинуть исключение - и что, каждый раз ставить try..catch ? И еще в каждом catch ставить throw, чтобы основная прога (которая вызвала ф-ию 1) тоже поймала исключение ?
Какая-то ерунда... Программист - не дурак, сам знает, когда и где ему ожидать исключений, а специально "тыкать носом" его, по-моему, абсурд.
Цитата
Хотелось бы иметь возможность работать с ММХ и расширениями SSE.

А кто мешает ? Асм-вставки давно не новинка...



--------------------
С уважением, г-н Посол.
PM   Вверх
achmed
Дата 10.4.2004, 19:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











по поводу switch, было бы неплохо что бы его расширили до испосльзования
всех пользовательских типов реализующих operator==,

еще хотелось бы безимянных функций (лямбда ф-ий, как boost::lambda),

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

хорошо бы сделать перегрузку функций как в C#, т.е. когда перегружаешь
ВФ, то пишешь ключевое слово overflow (ну или какое другое), т.е. если ошибся с сигнатурой,
что часто бывает с C++, то компилятор выдаст соотв. ошибку.

шаблоны сканера и парсера тоже не помешали бы (boost::tokenizer, boost::spirit)

да, механизм сигналов и слотов, для GUI приложений очень удобно, реализовано в Qt,
там они транслируются в C++ код.

  Вверх
sergejzr
Дата 10.4.2004, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



2 p0s0l
Цитата
Например, вызываю функцию 1 (при этом она в try..catch), та в свою очередь использует сотни функций, каждая из них может выкинуть исключение - и что, каждый раз ставить try..catch
Нехорошим стилем в ООП считается функция на сто строк(По поводу вызова ста функций).
Носом тыкать обязательно, поскольку иначе юзер вообще может быть не в курсе какие исключения могут при вызове функции полететь. В Яве механизм прекрасно работает.

2 achmed
Цитата
java прграммы буквально загромождаютсяблоками try..catch
Если нормально сдвигать, то это не проблема ИМХО. Всё аккуратно и понятно.

2 p0s0l
Цитата
Асм-вставки давно не новинка...
Вот именно, АСМ а не Си. Я согласен с тобой, что любой может написать свою функцию с вставкой АСМ. Просто Анзи Си обеспечивает интероперабилитет (Не знаю как АСМ. если так же, прошу считать пункт закрытым).

2 achmed
Цитата
по поводу switch, было бы неплохо что бы его расширили до испосльзования
всех пользовательских типов реализующих operator==
Это на много облегчило бы жизнь и улучшило читабельность кода ИМХО.


Ребята, спасибо за интересную раскладку!








--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Fantasist
Дата 14.4.2004, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата
JAVA: если функция кидает Exception, то она должна быть соответственно задекларирована.
Если юзер вызывает такую функцию, он ОБЯЗАН работать с try catch. К сожалению в Си++ это не так  Хотим кидаем хотим ловим.


Здесь я бы согласился, но это пока не отвечает духу С++. После недолгой работы с Java я понял что фича очень стоящая. Она заранее заставляет задуматься о грамотной иерархии обработки ошибок, да и действиетльно выглядит гораздо нагляднее. Всем четко известно, что ловить, и все обязаны это ловить. Повышает стабильность. Но все-таки это не в стиле языков подобных С++. Даже если взять только исторические причины, то очень много старого кода оказалось бы невозможно использовать при добавлении такой фичи. Java все-таки отдельный разговор (был, во всяком случае, пока не появился С#) .


--------------------
Волны гасят ветер...
PM MAIL   Вверх
sergejzr
Дата 14.4.2004, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата
Fantasist
..очень много старого кода оказалось бы невозможно использовать при добавлении такой фичи..

К сожалению это действительно так! Примерно как с телевизорами. Eщё много лет будем юзать ужасные PAL/SECAM, хотя современная технология позволяет значительные расширения разрешаюшей способности, итд,итп.
Вообще изменение стандарта дело нелёгкое из за хвостов. А ЯВА была написана с нуля и к счастью концептуально, хотя казалось бы главной задачей был именно интероперабилитет. Совершенно согласен, что не надо из Си++ делать ЯВУ, но кое чему стоило бы поучиться.




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
achmed
Дата 14.4.2004, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



стандарт предусматривает спецификацию исключений, но не обязывает реализовывать.
http://www.codeproject.com/useritems/stdexceptionspec.asp

PM MAIL   Вверх
mr.DUDA
Дата 14.4.2004, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Если будет добавлена поддержка свойств на уровне синтаксиса языка - это будет просто рулез !!! Под свойствами я имею ввиду:
Цитата
class A
{
   private:
      int   m_x;

   public:
      int x
      {
         get
         {
            // какие-то действия, связанные с чтением свойства "x"
             return  m_x;
         }
         set
         {
             m_x = value;
            // какие-то действия, связанные с записью свойства "x", например:
             MessageBox(0, "x изменилось !", 0, MB_OK);
         }
      }
};

void main()
{
  A  obj;
  obj.x = 1;
  int  y = obj.x;
}

("новые" ключевые слова выделены курсивом)

В C# и ManagedC++ это действительно рульная фича, вот если бы в стандарте С++ было такое rolleyes.gif ...


--------------------
user posted image
PM MAIL WWW   Вверх
Hearse
Дата 15.4.2004, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



По поводу использования MMX(SSE) - было бы приятно, если бы в STL включили стороннюю библиотеку типа Intel Small Matrix Library.
По поводу перегрузки с помощью overload, в старых версиях компиляторов оное ключевое слово было, однако отказались, посчитав избыточным. Пусть лучше компилятор выводит статистику для перегруженных функций типа

func1 - n overloads
func2 - m overloads и т.д.
PM MAIL   Вверх
sergejzr
Дата 15.4.2004, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата
achmed
стандарт предусматривает спецификацию исключений, но не обязывает реализовывать.

Ну так меня почти устраивает.

Вот только жаль..
Цитата

stdexceptionspec
Exception specifications are not checked at compile time - they are enforced at run time.
Ведь типы проверяются, почему исключения не могут?




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1280 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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