[英]What are the pros and cons of skipping some member variable initialization in c++?
[英]C++ member variable initialization, but first do some work inside it
我有以下課程:
class MyClass {
public:
MyClass(string something);
~MyClass();
private:
some_namespace::some_class_name my_variable_name;
};
具有以下構造函數定義:
MyClass::MyClass(string path) {
string other = "jwrhkfg";
my_variable_name = some_namespace::some_class_name(path+other)
}
我正在嘗試將my_variable_name
初始化為依賴於path
。 我知道我可以使用初始化列表:
MyClass::MyClass(string path) : my_variable_name(path+other) {}
但是,如果我需要在path
字符串之上進行大量處理然后初始化my_variable_name
怎么my_variable_name
? 如果我需要執行以下操作怎么辦:
MyClass::MyClass(string path) {
string other = "jwrhkfg";
if (path="site.com") {
other = "oritrot";
} else {
other = "hsghkr";
}
my_variable_name = some_namespace::some_class_name(path+other)
}
我不能將這些if
放在初始化列表中。
我認為上面的代碼會起作用,因為我只聲明了名稱my_variable_name
但未定義它,因此我可以在構造函數中進行操作,但是當我這樣做時:
MyClass my_object = MyClass("some_string");
我知道some_class_name
沒有構造some_class_name
(因為默認構造函數接受一個參數,在這里它試圖初始化,即使我沒有初始化它,也只是聲明了)。
我不能將這些ifs放在初始化列表中。
您可以使用函數來確定值,並在初始化列表中使用該值:
string MyClass::getOther(string path) {
if (path == "site.com") {
return "oritrot";
}
return "hsghkr";
}
MyClass::MyClass(string path) : my_variable_name(path + getOther(path)) {
}
三元條件也適用於您的簡單情況:
MyClass::MyClass(string path)
: my_variable_name(path + (path == "site.com")?"oritrot":"hsghkr") {
}
讓您的成員成為智能指針:
class MyClass {
public:
MyClass(string something);
~MyClass();
private:
std::unique_ptr<some_namespace::some_class_name> my_variable_name;
};
MyClass:MyClass(string path) {
string other = "jwrhkfg";
my_variable_name = std::make_unique<some_namespace::some_class_name>(path+other);
}
同樣,如果您不想創建單獨的函數僅用於初始化列表,則可以使用lambda:
MyClass::MyClass(std::string path)
: my_variable_name(
[&]() -> some_namespace::some_class_name
{
// do work here and return desired value
string other = "jwrhkfg";
if (path="site.com") {
other = "oritrot";
} else {
other = "hsghkr";
}
return some_namespace::some_class_name(path+other);
}() /*call lambda immediately*/ )
{}
盡管的確如此,但是這種情況下可以使用三元表達式(如user0042所指出),使用lambda的方法更為通用,並且適用於任何復雜的初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.