Аргументы main
определяются средой выполнения C и являются единственным стандартным/переносимым способом получения аргументов командной строки. Не боритесь с системой. :)
Если все, что вы хотите сделать, это предоставить доступ к параметрам командной строки в других частях программы с помощью вашего собственного API, есть много способов сделать это. Просто инициализируйте свой собственный класс, используя argv/argc
в main
, и с этого момента вы можете игнорировать их и использовать свой собственный API. Шаблон singleton отлично подходит для такого рода вещей.
Чтобы проиллюстрировать это, Qt, одна из самых популярных сред C++, использует этот механизм:
int main(int argc, char* argv[])
{
QCoreApplication app(argc, argv);
std::cout << app.arguments().at(0) << std::endl;
return app.exec();
}
Аргументы перехватываются приложением и копируются в файл QStringList
. Дополнительные сведения см. в разделе QCoreApplication::arguments().
Точно так же Cocoa на Mac имеет специальную функцию, которая захватывает аргументы командной строки и делает их доступными для фреймворка:
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
return NSApplicationMain(argc, (const char **)argv);
}
Затем аргументы доступны в любом месте приложения с помощью NSProcessInfo.arguments.
Я заметил в вашем обновленном вопросе, что ваш класс напрямую хранит копию argc/argv
в своем экземпляре:
int const argc_;
char const** const argv_;
Хотя это должно быть безопасным (время жизни указателей argv
должно соответствовать полному времени жизни процесса), это не очень похоже на C++. Рассмотрите возможность создания вектора строк (std::vector<std::string>
) в качестве контейнера и скопируйте в него строки. Тогда они даже могут безопасно изменяться (если хотите!).
Я хочу создать класс, независимый от main(), чтобы argc и argv не нужно было явно передавать коду, который их использует.
Непонятно, почему передача этой информации от main
— это что-то плохое, чего следует избегать. Именно так это делают основные фреймворки.
Я предлагаю вам рассмотреть использование синглтона, чтобы убедиться, что существует только один экземпляр вашего класса Application
. Аргументы могут быть переданы через main
, но никакому другому коду не нужно знать или заботиться о том, откуда они взялись.
И если вы действительно хотите скрыть тот факт, что аргументы main
передаются вашему конструктору Application
, вы можете скрыть их с помощью макроса.
person
gavinb
schedule
03.05.2016
main
. - person Some programmer dude   schedule 03.05.2016argc
иargv
в класс, взгляните на почти все переносимые и независимые от платформы графические интерфейсы, все они требуют, чтобы пользователь фреймворка явно передалargc
иargv
в фреймворк. Так что это обычное дело, а не то, к чему программисты не привыкли. - person Some programmer dude   schedule 03.05.2016linux
,windows
,posix
иbsd
и говорите, что этот вопрос зависит от ОС? Если бы это было специфично для ОС, вы бы упомянули только одну ОС, ту, на которую вы нацелены. - person Some programmer dude   schedule 03.05.2016