我正在做一本书的练习。我有一个类(名为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;
}
}
但它不起作用。我没有在互联网上找到任何溶剂。 我该怎么做?
答案 0 :(得分:1)
*this
作为分配的可行目的地有几个先决条件:
const
。... operator=(Golf ...)
...
适当重新设置)。默认赋值运算符通常是正确的:它执行成员赋值。您可能需要自己的版本,例如,如果您需要维护资源(例如,当您还有复制构造函数和析构函数时)。赋值运算符的另一个原因是需要使赋值强烈异常安全,但其中一个成员赋值可能抛出异常,例如,如果它是std::string
或std::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);
或者,您可以重命名本地变量以隐藏该成员,尽管有些人不赞成这种情况。