2017-03-02 53 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()); 
}