2013-08-11 2 views
1

В Python У меня есть класс флагов, который я нашел очень полезным. Я новичок на C++ и не могу воспроизвести эту функцию python в C++. Вместо того, чтобы ставить код C++, который не работал, вот что я ищу для репликации, и мне нужны некоторые предложения о том, куда идти, шаблоны, виртуальные или?Как динамически добавить свойство key: value в класс C++, а затем сделать его доступным как class.property

Требование является возможность динамически изменять члены класса, в Python это модификации Dict элемент класса это сам, что позволяет это.

В Python:

импорт SYS Args = []

... нагружает вверх Args [] с помощью клавиши: значения циклически sys.argv [] ... бла-бла-бла

класс Флаг:

защиту __ __ INIT (самостоятельно, ** арг):

. . __ __ ДИКТ обновление (арг)

теперь позволяют flag.dynamicproperty

флаг = флаг (** Dict (арг))

Пример использования: $ питон script.py somedesc1 someval1 somedesc2 someval2

Что это делает позволяет мне пройти в параметрах, как и выше, из командной строки и присвоить любое количество из них на лету и сделать то доступны по flag.property (например, flag.somedesc1) вызов whi ch возвращает somval1. Еще один способ подумать об этом - это динамическое добавление свойства key: value в класс C++.

Пример использования в коде питона:

если flag.somedesc1 = '10': печать someval1

Я не могу сделать сопоставимый C++ работу. Я рассмотрел полиморфизм, но они должны быть назначены динамически, а затем доступны как свойство класса.

Идеи ??? Конечно, C++ может это сделать, я просто не знаю, с чего начать.

ответ

0

Нет, вы не можете сделать это на C++. В C++ члены класса определяются во время компиляции 100%. Вы не можете добавлять какие-либо данные во время выполнения. Способ сделать это в C++ должен иметь переменную-член, которая является map<string,string>, которая содержит пары ключ/значение, а затем имеет функцию string getVariable(string), которая возвращает значение в словаре для этого ключа.

+0

Изначально я пытался использовать вектор в качестве динамического держателя контента, я просто не мог найти способ привязать его к объекту и дать ему имя для ключа. Я попытаюсь что-то придумать с помощью карты и getVariable (string), как вы предлагаете. – user2671474

+0

Можете ли вы представить себе какой-либо способ создания динамического enum? – user2671474

1

Хорошо, вот решение, которое я разработал; еще не проверили его, но должны работать достаточно близко, чтобы соответствовать моим потребностям, используя этот формат.

флаг.find (filename)

enum {имя файла, работники, время выполнения};

флаг класс {

vector<string> helplist; 

общественности: INT добавить (интермедиат ARGC, символ * ARGV [], строка флаг, значение строки, строка описания) {

string flagvalue; 
    flagvalue = value; 
    helplist.push_back(description); 
    for (int i; i < argv.length(); i++) { 
     if (argv[i]==flag) { 
      flagvalue = argv[i+1]; 
     } 
    } 
} 
void showhelp() { 
    for (int i; i < helplist.length(); i++) { 
     cout << helplist[i] << endl; 
    } 
} 

};

+0

Обычно вы должны проверить решение * перед отправкой. –

Смежные вопросы