0

我正在做一本书的练习。我有一个类(名为 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;
    }
}

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

4

3 回答 3

1

*this成为可行的任务目的地有几个先决条件:

  1. 成员函数不能是const
  2. 赋值操作符(... operator=(Golf ...)带有...适当的重排)不会被删除。
  3. 生成的分配或明确定义的分配都做正确的事。

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

于 2013-09-11T12:54:29.377 回答
1

可能,创建对象本身是单例中众所周知的方法,但是使用了静态方法:

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

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

于 2013-09-11T13:16:52.270 回答
1
*this = Golf(fullname, handicap);

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

*this = Golf(name, handicap);

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

于 2013-09-11T13:28:31.093 回答