2017-08-17 18 views
1

我有以下類:C++成員變量初始化,但首先做裏面的一些工作,它

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?如果我需要做這樣的事情:

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 S IN的初始化列表。

我想上面的代碼會工作,因爲我只是聲明瞭名稱my_variable_name但沒有定義它,這樣我就可以在構造函數中做,但是當我做:

MyClass my_object = MyClass("some_string"); 

我拿到那有沒有構造函數some_class_name(因爲默認構造函數有一個說法,在這裏它試圖初始化即使我沒有初始化,只是聲明

+2

你完全錯過了[構造函數列表](http://www.cprogramming.com/tutorial/initialization-lists-c++.html)的要點。請閱讀鏈接的文章。 – paulsm4

回答

0

讓您的會員智能指針代替。

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); 
} 
+0

爲什麼它適用於對象「unique_ptr」,但不適用於我的類型的對象?有什麼不同? –

+1

'unique_ptr'是'some_namespace :: some_class_name *'的一個包裝。它的默認構造函數用'nullptr'初始化它。 – SingerOfTheFall

+0

MyClass my_object的創建不會調用unique_ptr的consctructor而沒有參數嗎? –

2

我不能把這些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") { 
} 
0

而且,如果您不想創建僅用於初始化列表的單獨函數,則可以使用lambdas:

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的方法更通用,並且可以適用於任何複雜初始化的情況。