Дизайн модулей в C ++ - PullRequest
       4

Дизайн модулей в C ++

2 голосов
/ 26 января 2011

Я новичок в этом сайте, и я хочу задать вам несколько вопросов о C ++, потому что я изучаю его в эти дни, и я новичок (я просто знаю C и Java).

IЯ пользуюсь книгой Страуструпа, но я до сих пор не понимаю использования и различий между классами и пространствами имен.

Также я написал несколько программ на С для предмета (операционных систем) и хочу объединить их все впрограмма на C ++.Идея, которую я имею, состоит в том, чтобы создать некоторые модули (потому что программы полагаются, но они предназначены для другой цели).А также у меня есть файл "main.cpp", в котором определена функция справки, которая вызывается модулями несколько раз, проверьте, доступен ли модуль, и если да, вы можете выбрать функцию, которую вы хотите (в зависимости отпараметр, который вы передали).

Но проблема в том, что я не знаю, как лучше это сделать.Что я должен использовать?классы или пространства имен?и как мне сделать хороший дизайн?Я подумал об использовании некоторого дизайна следующим образом:

main.cpp

-> ModuleA.cpp (реализовать InterfaceA.h)

-> ModuleB.cpp (реализовать InterfaceB.h)

-> ModuleC.cpp (реализовать InterfaceC.h)

Я искал в этом Интернете несколько других похожих вопросов и нашел что-то вроде thisодин но я думаю, что это слишком сложно для моей простой программы.

Большое спасибо:)

Ответы [ 2 ]

3 голосов
/ 26 января 2011

Вы не добьетесь успеха, если будете самостоятельно использовать только пространства имен :) Все, что они делают (как следует из их названия), - предоставляют именованное пространство для типов, чтобы предотвратить загрязнение глобального пространства имен и предотвратить конфликт между идентичными именами типов.Поэтому для API характерно иметь внешнее пространство имен, содержащее все, что у него есть, тем самым предотвращая конфликты с другими API:

namespace MoosLibrary
{
    typedef boost::uuids::uuid Uuid;  // Moo's unique identifier!
};



namespace AnotherLibrary
{
    typedef int Uuid;          // this library uses integers for unique identifiers
};

В приведенном выше фрагменте без пространств имен два типа Uuid будут конфликтовать, вызываянеисчислимые ошибки компиляции и царапины головы программирования.Однако, разделив их на отдельные пространства имен, мы можем избежать подобных конфликтов типов.Обратите внимание на приведенный выше пример boost::uuids::uuid.Здесь есть два пространства имен. boost - это библиотека C ++ boost (настоятельно рекомендуется, когда вы переходите на этот уровень C ++!), А uuids - это пространство имен в boost, предназначенное для этой конкретной части библиотеки.

Таким образом, из этого видно, что пространства имен не только хороши для предотвращения конфликтов между типами, но также позволяют структурировать проекты в логические пространства имен, чтобы глобальное пространство имен не было полно типов.Это действительно удобно, если ваша IDE поддерживает intellisense.

namespace MoosLibrary
{
    namespace Logic
    {
        // logic related classes/types
    }

    namespace UI
    {
        // user-interface
    }
}

Примечание: detail - это пространство имен, с которым связано неписаное правило.Это в основном то, где авторы API помещают материал, который должен быть публично видимым, но не облажаться.

1 голос
/ 26 января 2011

Если вы знаете Java, то просто представьте, что пространство имен C ++ - это пакет Java, а класс C ++ - как класс Java.

В общем, лучше иметь один класс на исходный файл.Если у вас есть связанные классы, вы можете использовать их в одном пространстве имен.

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