将临时对象分配给调用对象

Assigning temporary object to the invoking object

本文关键字:调用 对象 分配 临时对象      更新时间:2023-10-16

我正在做一本书的练习。我有一个类(名为 Golf),其中一个函数应该将一些数据传递给构造函数以创建一个临时对象,并将临时对象分配给调用对象,即 *this。这是代码:

Golf::Golf(const std::string name, int hc)
{
    fullname = name;
    handicap = hc;
}
int Golf::setgolf()
{
    std::string name;
    std::cout << "Enter the name: ";
    std::getline(std::cin, name);
    std::cin.clear();
    std::cin.sync();
    if (name == "")
        return 0;
    else
    {
            int handicap;
            std::cout << "Enter the handicap: ";
            std::cin >> handicap;
            *this = Golf(fullname, handicap); //this line doesn't set the values
            return 1;
    }
}

但它不起作用。我在互联网上没有找到任何解决方案。我应该怎么做?

*this = Golf(fullname, handicap);

这将从当前对象的fullname字段中初始化临时对象的fullname而不是从刚刚从输入中读取的名称。您可能希望:

*this = Golf(name, handicap);

或者,您可以重命名局部变量以隐藏成员,尽管有些人不赞成这种事情。

*this成为

作业的可行目的地有几个先决条件:

  1. 成员函数不能const
  2. 不会删除分配操作(... operator=(Golf ...)适当调整...节奏)。
  3. 生成的赋值或显式定义的赋值都执行正确的操作。

默认赋值运算符通常是可以的:它执行成员赋值。您可能需要自己的版本,例如,如果您需要维护资源(即,当您还有复制构造函数和析构函数时)。赋值运算符的另一个原因是需要使赋值具有很强的异常安全性,但其中一个成员赋值可能会抛出异常,例如,如果它是std::stringstd::vector<T>

也许,创建对象本身是众所周知的单调方式,但使用了静态方法:

class Golf{
private:
    Golf *p;
    Golf(){}
public:
    static Golf* instance(){
        if(p == NULL)
            p = new Golf();
        return p;
    }
}
Golf::p = NULL;

在第一次调用 Golf::instance() 时,您创建新对象,接下来的调用仅返回指向现有对象的指针。