我是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
}
答案 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());
}
答案 1 :(得分:0)
如果您希望保留具有自动存储持续时间的对象(&#34;堆栈已分配&#34;),则只需将对象创建到其自身的功能中:
myClass createIt(int choice) {
if (choice == 1) return myClass();
int parameter;
cout << "parameter: ";
cin >> parameter;
return myClass(parameter);
}
然后,在main
:
myClass object = createIt(choice);
由于返回值优化,这(可能)不会导致不必要的副本。