Стиль программирования C ++ - PullRequest
12 голосов
/ 17 декабря 2008

Я старый (но не слишком старый) Java-программист, который решил изучать C ++. Но я видел, что большая часть стиля программирования на C ++ ... ну, черт возьми, ужасна!

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

Итак, наконец, есть ли причина для меня продолжать эту резню в ООП и все, что хорошо и справедливо в программировании, или я могу просто игнорировать эти устаревшие соглашения C ++ и использовать мой хороший стиль программирования Java

Кстати, я изучаю C ++, потому что хочу заниматься программированием игр.

Вот пример:

На веб-сайте C ++ я нашел реализацию Windows:

class WinClass
{
    public:

        WinClass (WNDPROC wndProc, char const * className, HINSTANCE hInst);
        void Register ()
        {
            ::RegisterClass (&_class);
        }

    private:

        WNDCLASS _class;
};

Этот класс находится в заголовочном файле и конструкторе:

WinClass::WinClass (WNDPROC wndProc, char const * className, HINSTANCE hInst)
{
    _class.style = 0;
    _class.lpfnWndProc = wndProc;  // Window Procedure: mandatory
    _class.cbClsExtra = 0;
    _class.cbWndExtra = 0;
    _class.hInstance = hInst;           // Owner of the class: mandatory
    _class.hIcon = 0;
    _class.hCursor = ::LoadCursor (0, IDC_ARROW); // Optional
    _class.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // Optional
    _class.lpszMenuName = 0;
    _class.lpszClassName = className;   // Mandatory
}

Находится в исходном файле .cpp.

Что я мог просто сделать, это:

class WinClass
{
    public:
        WinClass (WNDPROC wndProc, char const * className, HINSTANCE hInst)
        {
            _class.style = 0;
            _class.lpfnWndProc = wndProc;  // Window Procedure: mandatory
            _class.cbClsExtra = 0;
            _class.cbWndExtra = 0;
            _class.hInstance = hInst;           // Owner of the class: mandatory
            _class.hIcon = 0;
            _class.hCursor = ::LoadCursor (0, IDC_ARROW); // Optional
            _class.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // Optional
            _class.lpszMenuName = 0;
            _class.lpszClassName = className;   // Mandatory
        }

        void Register ()
        {
            ::RegisterClass (&_class);
        }

    private:
        WNDCLASS _class;
};

И теперь конструктор находится внутри своего класса.

Ответы [ 16 ]

3 голосов
/ 17 декабря 2008

Это совсем не страшно. Я бы сказал, что это ... Ммм ... Переносить ваш старый стиль на новую платформу, это ужасно (у меня было много дискуссий по этому поводу с мистером Скитом).

Помните, Java была определена спустя годы после C ++, поэтому вполне разумно, что они исправили некоторые конструкции (таким же образом C # учатся на Java).

Итак, я бы предложил придерживаться этого стиля C ++.

Подумай об этом. Заголовочные файлы похожи на объявления интерфейса, а cpp-файлы - на реализацию.

Я думаю, что в C ++ нет ключевого слова "interface", и именно так вы отделяете интерфейс класса от его реализации. Аналогично этому в Java:

public interface Some { 
    public void method();
}

public class SomeImpl implements Some { 
    public void method(){}
}
3 голосов
/ 17 декабря 2008

Если вы хотите реализовать все свои методы внутри определений классов, у вас будут большие заголовочные файлы monster (не рекомендуется объявлять классы в файлах cpp) и, возможно, только один файл cpp (тот, который имеет вашу основную функцию ).

Так что это вопрос удобства.


Edit:

Я считаю, что разделение объявления-реализации действительно полезно. Когда у меня есть классы монстров с ~ 150 методами, реализация которых генерируется с использованием множества приемов препроцессора, я часто хочу уметь различать ...

  • что может сделать класс (его интерфейс, указанный в объявлении)
  • как это делает класс (его реализация)

Невозможность сделать это ни в C #, ни в Java весьма разочаровывает, особенно когда у меня под рукой нет Intellisense.

2 голосов
/ 17 декабря 2008

Я думаю, что многие программисты покончили с зубами продуктами MicroSoft (и их примером кода) и / или программированием для Windows API и ранними соглашениями о кодировании Microsoft, которые использовались во фрагменте кода в вашем вопросе (т.е. типы и т.д ..). Мне не нравится смотреть на исходный код от MicroSoft, который выглядит так, как будто он был пропущен через сквозную бумагорезку и склеен обратно. Но уродливое соглашение о кодировании не является функцией или отражением языка C ++, который я нахожу не более красивым или уродливым, чем большинство других языков.

На самом деле, я нахожу синтаксис C ++ с минимальными ключевыми словами, фигурными скобками и богатым набором символических операторов, чтобы не отвлекать и не вытеснять важные вещи: мои переменные, мои определения типов, мои методы; что, конечно, позволяет мне сделать самый красивый код из всех: -)

1 голос
/ 17 декабря 2008

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

Кроме того, C ++ и Java - это два разных языка, и их нужно использовать по-разному. Например, существуют заголовки для файлов заголовков (например, для объявления интерфейса).

1 голос
/ 17 декабря 2008

Стиль, в котором вы программируете, зависит от вас. Просто убедитесь, что вы понимаете, какой "уродливый" стиль используют другие.

1 голос
/ 17 декабря 2008

Я обеспокоен тоном вашего вопроса, что вы, возможно, читаете какой-то плохой код C ++ при изучении C ++. Хорошо написанный код обычно не уродлив на любом языке. В качестве отправной точки вы можете попробовать онлайновый FAQ по C ++ , особенно главу по изучению C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...