Аргументы main
определены в среде выполнения C и единственным стандартным/переносным способом получения аргументов командной строки. Не сражайтесь с системой. :)
Если все, что вы хотите сделать, это предоставить доступ к параметрам командной строки в других частях программы с помощью вашего собственного API, есть много способов сделать это. Просто инициализируйте свой собственный класс, используя argv/argc
в main
, и с этого момента вы можете игнорировать их и использовать свой собственный API. Синтаксический шаблон отлично подходит для такого рода вещей.
Для иллюстрации, один из самых популярных структур C++, Qt использует этот механизм:
int main(int argc, char* argv[])
{
QCoreApplication app(argc, argv);
std::cout << app.arguments().at(0) << std::endl;
return app.exec();
}
Аргументы захваченного приложения и скопированный в QStringList
. См. QCoreApplication::arguments() для более подробной информации.
Кроме того, какао на 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
«s в настоящее время передается в ваш Application
конструктор, вы можете скрыть их с помощью макроса.
Что вы имеете в виду «получить»? Где еще? – user3078414
Нет никакого переносного или стандартного способа получения аргументов для программы, кроме аргументов 'main'. –
@PaulR да, да, API-интерфейсы находятся в C, как вы знаете, но класс находится на C++. Я не хотел отвечать на python, хотя это было бы круто. – user1095108