这可能很难解释。有这段代码:
void user_choice(string f) {
bool goodchoice;
string file = f;
while (!goodchoice) {
string answer;
cin >> answer;
if (answer == "save") {
Data(file, "05/05/2014");
goodchoice = true;
}
else if (answer == "look") {
Data(file);
goodchoice = true;
}
else cout << "I don't understand that. Please try again." << endl;
}
}
我有一个名为Data
的类,包含这些构造函数:
Data(string n);
Data(string n, string d);
我在我的主CPP文件中包含了Data.h头文件。 'save'的if语句工作正常,但'look'的if语句告诉我,即使存在,也没有Data的默认构造函数。我正在使用Visual Studio 2013。
答案 0 :(得分:3)
Data(file);
这不是调用构造函数的字符串。相反,它声明了一个名为Data
的{{1}}对象,并使用默认构造函数来完成它。它与以下内容相同:
file
我不记得100%这种行为存在的原因,但我相信它是从C继承的。你应该能够通过将它与最烦恼的解析相关联来找到更多这方面的例子,因为这种情况发生在与此有关。
有趣的是,这不是通过添加另一组括号来修复它的情况之一。我不知道接受的方法是使这个调用成为构造函数(可能是为了更好,如下所述),但是cast是一个选项,并且调用另一个函数,尽管两者看起来都不自然:
Data file;
除非构造函数有副作用,否则它们不会做任何有意义的事情,只需创建和销毁对象。老实说,我不确定这些陈述的意义是什么。如果构造函数负责执行操作而您只需要临时对象,请改为使用Data((file)); //doesn't work
Data(static_cast<string>(file)); //works
(void)Data(file); //works
template<typename T>
T &self(T &arg) {
return arg;
}
Data(self(file)); //works
函数。如果要使用实例调用其上的成员函数或类似函数,则应将实例存储在变量中,以便可以使用该变量执行它需要执行的操作。对于更深层次的问题,上述“修复”应该都是浅层的解决方法。
答案 1 :(得分:0)
数据是一个类,而不是一个对象。因此,Data(file)
调用复制构造函数。并且您没有声明复制构造函数。您需要声明像Data data
和data(file)
答案 2 :(得分:0)
你需要两件事之一......这两个构造函数之一
Data();
//or
Data(string n = "default argument here");
当你说Data(file);
时,你也会犯一个错误,因为你正在创建一个&#34;数据&#34;类型的临时对象。通过调用构造函数但您没有存储它。我认为你很想做到这一点。
void user_choice(string f) {
bool goodchoice;
Data myData;//this requires the constructors i listed above
string file = f;
while (!goodchoice) {
string answer;
cin >> answer;
if (answer == "save") {
//assign to data by calling the constructor
myData=Data(file, "05/05/2014");
goodchoice = true;
}
else if (answer == "look") {
//assign to data by calling the constructor
myData=Data(file);
goodchoice = true;
}
else cout << "I don't understand that. Please try again." << endl;
}
}
我相信这应该可以解决你的问题。 祝你好运