В этом вопросе смешано несколько вещей. Я постараюсь обратиться к ним по отдельности.
Сообщение об ошибке в конструкторе по умолчанию именно так: вы просите создать экземпляр этого класса, но вы предоставляете только один способ сделать это:конструктор с параметром string
.
Два способа, которыми вы можете справиться с этим "напрямую":
- предоставляют конструктор по умолчанию, либо явно указав его, либо сделав
string
необязательный параметр, например, my_class(string var1_val = {})
- предоставляет указанный параметр во время создания экземпляра:
my_class f{""};
Имеет переменную "снаружи" в глобальной области видимости, но инициализируетсяв main()
... Кроме того, несколько способов справиться с этим (лично я бы посоветовал против такой практики по разным причинам, но предоставляя варианты здесь для полноты):
- Используйте указатели. Объявите вашу переменную как
my_class * f{nullptr};
или, что еще лучше, в качестве умного указателя: std::unique_ptr<my_class> f;
и создайте экземпляр объекта в вашей основной сети как голый указатель f = new my_class("string");
или умный указатель f = std::make_unique<my_class>("args");
- , которые имеютпеременная local для
main()
и передача ее в любую нужную вам функцию в
Вы также можете использовать шаблон Singleton, где у вас есть фабричная функция, которая управляет вашим f
(опять же, ужасная идея в данном случае, но для полноты):
my_class & get_my_class(string s = {}){
static my_class * mc{nullptr};
if(!mc){ mc = new my_class{s}; } // <-- memory leak here unless you use unique_ptr
return *mc;
}
int main(){
// ...
auto & m{get_my_class("user input")};
// ...
}
void other_function(){
auto & f{get_my_class()};
// use f
}