基于用户';在运行时创建对象;s输入 我是C++新手。我试图询问用户是要创建对象还是要创建参数化对象(并将参数作为输入)
下面的示例程序实现了我想要的功能,但是我认为这是错误的,因为指针将指向不再为我的程序保留的内存(因为对象obj超出范围)基于用户';在运行时创建对象;s输入 我是C++新手。我试图询问用户是要创建对象还是要创建参数化对象(并将参数作为输入),c++,class,object,C++,Class,Object,下面的示例程序实现了我想要的功能,但是我认为这是错误的,因为指针将指向不再为我的程序保留的内存(因为对象obj超出范围) #包括 使用名称空间std; 类myClass{ int-num; 公众: myClass() { num=0; } myClass(int参数) { num=参数; } ~myClass() { cout para;//输入参数 myClass obj(第2段); ptr=&obj; } //从现在开始使用ptr-> } 问题在于,您构造的对象超出了范围-然后指针将指向无效
#包括
使用名称空间std;
类myClass{
int-num;
公众:
myClass()
{
num=0;
}
myClass(int参数)
{
num=参数;
}
~myClass()
{
cout para;//输入参数
myClass obj(第2段);
ptr=&obj;
}
//从现在开始使用ptr->
}
问题在于,您构造的对象超出了范围-然后指针将指向无效的内存位置
使用智能指针:
#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());
}
#包括
#包括
#包括
使用名称空间std;
类myClass{
int-num;
公众:
myClass()
{
num=0;
}
myClass(int参数)
{
num=参数;
}
~myClass()
{
cout para;//输入参数
重置ptr(新myClass(第段));
}
断言(ptr.get());
}
如果您想使用自动存储持续时间(“堆栈已分配”)的对象,则只需将对象创建纳入其自身的功能:
myClass createIt(int choice) {
if (choice == 1) return myClass();
int parameter;
cout << "parameter: ";
cin >> parameter;
return myClass(parameter);
}
由于返回值优化,这(可能)不会导致不必要的拷贝。您必须使用
new
动态分配它。最好使用std::unique_ptr
而不是myClass*
raw指针。@πάνταῥεῖ 我还没有研究过那个独特的ptr。但是,我将尝试使用新的。@πάνταῥεῖ 这是对的。如果您没有学习过std::unique_ptr
,请与std::observer_ptr
一起查找。在新代码中使用原始指针是一个坏主意。在您的代码中返回myClass()和myClass(参数),这些是否会返回myClass类型的对象?我想问的是,返回一个构造函数,返回一个对象?函数返回类的一个对象。
myClass createIt(int choice) {
if (choice == 1) return myClass();
int parameter;
cout << "parameter: ";
cin >> parameter;
return myClass(parameter);
}
myClass object = createIt(choice);