2017-03-02 95 views
0

我是C++新手。我試圖向用戶詢問他們是要創建一個對象還是創建一個參數化對象(並將參數作爲輸入)。基於用戶輸入在運行時創建一個對象

下面的示例程序做我想做的事但我相信這是錯誤的,因爲指針將指向不再爲我的程序保留的內存(因爲對象obj超出範圍)。

#include <iostream> 
using namespace std; 
class myClass{ 
    int num; 
    public: 
     myClass() 
     { 
      num=0; 
     } 
     myClass(int parameter) 
     { 
      num=parameter; 
     } 
     ~myClass() 
     { 
      cout << num << endl; //for checking purposes 
     } 
}; 
int main() 
{ 
    cout << "Use default(1) or parametrized(2) constructor: "; 
    int choice; 
    cin >> choice; 

    myClass *ptr; 

    if(choice==1) 
    { 
     myClass obj; 
     ptr = &obj; 
    } 
    else 
    { 
     int para; 
     cout<< "parameter: "; 
     cin>>para; //input parameter 
     myClass obj(para); 
     ptr = &obj; 
    } 

    //use ptr-> from here on out 
} 
+1

您必須使用'new'動態分配它。甚至更好的使用'std :: unique_ptr '而不是'myClass *'原始指針。 –

+0

@πάνταῥεῖ我還沒有研究那獨特的ptr的東西。 但是,我會盡力用新的方法來做到這一點。 –

+0

@πάνταῥεῖ是正確的。如果你還沒有研究過'std :: unique_ptr',那就去查看它,以及'std :: observer_ptr'。在新代碼中使用原始指針是個不錯的主意。 – Caleth

回答

0

如果你想留下來與自動存儲時間的對象(「堆棧分配」),那麼只需因素對象創建到它自己的功能:

myClass createIt(int choice) { 
    if (choice == 1) return myClass(); 
    int parameter; 
    cout << "parameter: "; 
    cin >> parameter; 
    return myClass(parameter); 
} 

然後,在main中:

myClass object = createIt(choice); 

由於返回值優化th是(可能)不會導致不必要的副本。

+0

在你的代碼中你正在返回myClass()和myClass(參數),這些會返回myClass類型的對象嗎? 即時嘗試要問的是,返回一個構造函數,返回一個對象? –

+0

該函數返回您的類的一個對象。 –

0

問題是您構建的對象超出了範圍 - 指針然後指向無效的內存位置。

使用智能指針:

#include <iostream> 
#include <memory> 
#include <cassert> 

using namespace std; 

class myClass{ 
    int num; 
public: 
    myClass() 
    { 
     num=0; 
    } 
    myClass(int parameter) 
    { 
     num=parameter; 
    } 
    ~myClass() 
    { 
     cout << num << endl; //for checking purposes 
    } 
}; 

int main() 
{ 
    cout << "Use default(1) or parametrized(2) constructor: "; 
    int choice; 
    cin >> choice; 

    std::unique_ptr<myClass> ptr; 

    if(choice==1) 
    { 
     ptr.reset(new myClass); 
    } 
    else 
    { 
     int para; 
     cout<< "parameter: "; 
     cin>>para; //input parameter 
     ptr.reset(new myClass(para)); 
    } 

    assert(ptr.get()); 
}