Как добавить «использование пространства имен» в определение класса на основе имени объекта? - PullRequest
0 голосов
/ 05 мая 2018

Я разрабатываю проект для школы. Это будет тот, который имитирует изменение численности населения планеты по континентам.

Первый вопрос касается дизайна. У меня есть файл данных, который содержит константы (темпы изменений, катастрофы, происходящие на этом континенте, исходные популяции и т. Д.) Для каждого континента. Файл данных организован в пространство имен «data», где каждый континент имеет пространство имен в данных (т. Е. Для определения численности населения Африки используйте data::Africa::population. Является ли файл данных хорошей идеей, или должны ли ставки устанавливаться для объекта в время создания объекта? Существует около 12 - 15 скоростей и параметров, которые необходимо установить, используя конструктор или функции.

Второй вопрос, при условии, что файл данных является хорошей идеей, является основным вопросом, согласно заголовку. Как добавить «использующее пространство имен» к объекту, чтобы я мог получить доступ к переменным, установленным в файле данных (в этом случае мне не нужно объявлять их локально. Единственная переменная, которая могла бы измениться, - это популяция, остальные постоянны)?

См. Пример ниже ...

Это файл данных, определенный в data.h:

namespace data {
    namespace Africa {
        double population = 12121212;
        // other variables here...
    }
}

Это continent.h (в основном конструктор):

class Continent {
    Continent(string name) {
        if (name == "africa")
            using namespace Africa; // I want this to apply 
                                    // to the entire object, not just the constructor
    }
}

Меня не беспокоит, что имена не будут совпадать (т.е. Африка! = Африка), потому что континенты создаются автоматически внутри класса Globe. (Итак, сначала создается объект глобуса. Внутри конструктора глобуса 7 континентов создаются и добавляются к вектору континента внутри globe.h. Континенты инициализируются с именем, которое я бы проверил и установил «использование пространства имен»).

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

Кроме того, причина, по которой я хотел получить файл данных, заключается в том, что внешний интерфейс приложения (т. Е. Графический интерфейс) не будет устанавливать скорости; ставки жестко закодированы. Я хотел, чтобы другие разработчики могли легко менять тарифы в одном месте (или даже нетехнические люди могли найти файл, в котором они могли бы изменять тарифы, например, после переписи или что-то в этом роде).

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Хорошая практика, которую, как я видел, используют многие программисты на С ++, помещает using namespace ... в класс, функцию или командный блок, чтобы он не расширялся дальше, чем вы хотели.

К сожалению, пространства имен переменных не разрешены, так как они обрабатываются препроцессором.

Также, поскольку using namespace ... соблюдает границы области видимости.

Это не повлияет на что-либо, что придет после оператора if.

if (name == "africa")
        using namespace Africa;
0 голосов
/ 05 мая 2018

Это неправильный дизайн.

using операторы обрабатываются только во время компиляции. Вы не можете использовать оператор using динамически на основе данных, полученных во время выполнения (т. Е. Имя континента).

data.h обрабатывается только во время компиляции, а не во время выполнения. Его значения не могут быть изменены динамически, например, после переписи. Изменения потребуют перекомпиляции проекта.

Я предлагаю сохранить все ваши значения во внешнем файле, базе данных и т. Д. Затем определите struct для хранения соответствующих значений и передайте его конструктору Continent во время выполнения. Для каждого континента считайте соответствующие значения из внешнего файла / базы данных, заполните им структуру и создайте объект Continent с этой структурой в качестве входных данных. Забудьте о попытке сохранить неконстантные данные в пространствах имен, как вы пытаетесь это сделать.

...