2012-05-25 78 views
2

我試圖創建一個對象,我想在switch-case裏面填充,但它超出了我的知識範圍。在C++中創建對象指針

我有這些構造函數:

cObj::cObj() 
{ 
} 

cObj::cObj(std::string filename) 
{ 
    //... 
} 

所以,基本上我想打電話給下面的方法,創建一個指向對象,並填充它在我的switch-case裏面:

void someThing() { 
    cObj myObj(); 

    switch (someValue) 
     case 0: 
      myObj("/some/path"); 
      break; 
     ... 
} 

我假設我的構造函數是錯誤的,因爲它不工作。

我該如何做到這一點?

回答

3

當你在這一行創建對象

cObj myObj(); 

(btw。你可能不想要這些括號。你想創建一個對象,而不是聲明一個函數)。

你調用構造函數。你不能在switch語句中再次調用它。 您可以創建一個單獨的方法:

cObj::cObj() 
{ 
} 

void cObj::SetFilename(const std::string& filename) { 
// ... 
} 

,並使用它像:

void someThing() { 
    cObj myObj; 

    switch (someValue) 
     case 0: 
      myObj.SetFilename("/some/path"); 
      break; 
     ... 
} 

我不知道你想要做什麼,但也許更好的辦法是首先確定什麼是文件路徑,然後創建對象?

void someThing() { 
    std::string filepath = "default/path"; 

    switch (someValue) 
     case 0: 
      filepath = "some/path"; 
      break; 
     ... 

    cObj myObj(flepath); 
} 

您還可以創建一個函數,將作出決定什麼路徑使用,並返回對象:

+0

'cObj myObj();'不會創建對象,因爲最棘手的解析 - 它實際上是一個函數聲明。 –

+0

+1爲您的最後一個想法(分解決定一個函數),這是我通常在這樣的情況下做的。 –

+0

最後的方法非常乾淨,我喜歡那樣。 – JavaCake

4

你不需要這個指針。

void someThing() { 
    cObj myObj; // Don't use parentheses for the default constructor. 
       // What you had was a function declaration, not an object creation. 

    switch (someValue) { 
     case 0: 
      myObj = cObj("/some/path"); 
      break; 
     ... 
} 

如果你沒有一個默認的構造函數,或者你不希望它被調用,那麼您可以使用指針,最好是聰明的:

void someThing() { 
    std::unique_ptr<cObj> myObj; 

    switch (someValue) { 
     case 0: 
      myObj.reset(new cObj("/some/path")); 
      break; 
     ... 
} 

或者,如lmmilewski暗示在,你可以分解出決定的函數,返回對象:

cObj choose(someType someValue) { 
    switch (someValue) { 
     case 0: 
      return cObj("/some/path"); 
     ... 
} 

void someThing() { 
    cObj myObj(choose(someValue)); 
    ... 
} 
+0

它好像當我嘗試使用對象中你提到了空的第一個方法是什麼?構造函數被調用,但是當我使用該對象時,它的空... – JavaCake

+0

@JavaCake:它是默認構造的。然後在switch語句中,我爲它分配一個新值。 (假設你沒有做任何事情來禁用賦值運算符) –