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

时间:2013-09-11 12:43:03

标签: c++ constructor

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

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

3 个答案:

答案 0 :(得分:1)

*this作为分配的可行目的地有几个先决条件:

  1. 成员函数不能是const
  2. 不会删除分配操作(... operator=(Golf ...) ...适当重新设置)。
  3. 生成的赋值或明确定义的赋值都是正确的。
  4. 默认赋值运算符通常是正确的:它执行成员赋值。您可能需要自己的版本,例如,如果您需要维护资源(例如,当您还有复制构造函数和析构函数时)。赋值运算符的另一个原因是需要使赋值强烈异常安全,但其中一个成员赋值可能抛出异常,例如,如果它是std::stringstd::vector<T>

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

*this = Golf(fullname, handicap);

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

*this = Golf(name, handicap);

或者,您可以重命名本地变量以隐藏该成员,尽管有些人不赞成这种情况。