簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM