Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于用户';在运行时创建对象;s输入 我是C++新手。我试图询问用户是要创建对象还是要创建参数化对象(并将参数作为输入)_C++_Class_Object - Fatal编程技术网

基于用户';在运行时创建对象;s输入 我是C++新手。我试图询问用户是要创建对象还是要创建参数化对象(并将参数作为输入)

基于用户';在运行时创建对象;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-> } 问题在于,您构造的对象超出了范围-然后指针将指向无效

下面的示例程序实现了我想要的功能,但是我认为这是错误的,因为指针将指向不再为我的程序保留的内存(因为对象obj超出范围)

#包括
使用名称空间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);