Как создать глобальный объект параметров

Если Вы открываете .aspx файл и переключатель между режимом конструктора и представлением HTML, и назад это запросит VS проверять средства управления и добавлять любого, которые отсутствуют в файл разработчика.

В VS2013-15 существует , Преобразовывают в команду веб-приложения под меню Project . До VS2013 эта опция была доступна в контекстном меню щелчка правой кнопкой для как (c/p) x файлы. Когда это сделано, необходимо видеть, что теперь имеете *.Designer.cs файл в наличии, и Ваши средства управления в HTML Дизайна будут доступны для Вашего управления.

пз: Это не должно быть сделано в режиме отладки, как не все "перекомпилировано" при отладке.

Некоторые люди также сообщили об успехе путем удаления .designer.cs файла и затем воссоздают пустой файл с тем же именем.

7
задан recipriversexclusion 8 July 2009 в 17:12
поделиться

6 ответов

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

так что макет (который может не компилироваться , отсутствует забавная функциональность Config, но она должна проиллюстрировать суть)

class Config
{
public:
   static Config * getConfig();
   static void setConfigFileName(string filename);
private:
   Config();
   static string m_filename;
   static Config * m_configInstance;
};

В случае, если я не совсем ясен, getConfig () будет смотреть на m_configInstance. Если он недействителен, он создаст его (имеет доступ к частному конструктору) и сохранит его в m_configInstance, чтобы каждый последующий вызов обращался к тому же самому.

Итак, ваш main () будет использовать setConfigFileName () , то любому классу достаточно будет вызвать Config :: getConfig (), а затем вызвать операции над ним. Намного чище, чем стандартная глобальная переменная.

Взрыв - за время, потраченное на написание этого, другие люди также предложили шаблон проектирования singleton. Ну что ж, надеюсь, дополнительное объяснение поможет.

6
ответ дан 6 December 2019 в 21:18
поделиться

Вы смотрели библиотеку параметров программы Boost ?

2
ответ дан 6 December 2019 в 21:18
поделиться

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

0
ответ дан 6 December 2019 в 21:18
поделиться

Что я сделал для своего класса конфигурации, так это создал одноэлементный статический класс с кешем хеш-таблицы. Мой файл конфигурации предназначен для чтения и записи для изменения настроек приложения.

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

2
ответ дан 6 December 2019 в 21:18
поделиться

Упомянув "фиаско с порядком статической инициализации", я предполагаю, что вам нужно иметь доступные элементы конфигурации для инициализации некоторых статических объектов. Одноэлементный класс ConfigFile будет работать, но вы должны изменить способ получения имени файла, так как информация необходима до запуска main (). Вам понадобится еще один синглтон, чтобы указать имя файла или встроить имя файла в сам класс конфигурации.

2
ответ дан 6 December 2019 в 21:18
поделиться

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

class Config
{
public:
   Config(const string & filename) {
      if (m_configInstance) {
         throw AlreadyInitException;
      }
      // do main init
      m_configInstance = this;
   }

   ~Config() {
      m_configInstance = 0;
   }

   static Config * getConfig() {
      if (!m_configInstance) {
         throw NoConfigException;
      }
      return m_configInstance;
   }

private:
   static Config * m_configInstance;
};

Config * Config * m_configInstance = 0;

Конструктор проверяет, что m_configInstance не установлен, если это так выдает исключение. Затем он завершает построение и регистрируется, устанавливая m_configInstance на этот .

Метод getConfig возвращает экземпляр или генерирует исключение, если он не установлен.

Деструктор снова устанавливает m_configInstance в 0.

Чтобы использовать класс, создайте его один раз в начале main () . Затем при необходимости обращайтесь к нему с помощью метода getConfig () .

Теперь время жизни объекта Config четко контролируется, в отличие от синглтона. И это дает дополнительное преимущество для модульных тестов,

0
ответ дан 6 December 2019 в 21:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: