2017-03-02 9 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'を使用する必要があります。また、 'myClass *'ローポインタの代わりに 'std :: unique_ptr 'を使用する方が良いでしょう。 –

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

次に、in main

myClass object = createIt(choice); 

戻り値の最適化th (おそらく)不要なコピーにつながることはありません。

+0

コードでmyClass()とmyClass(parameter)を返していますが、これは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()); 
} 
関連する問題