我已经编写了这段代码,但是当我尝试初始化Critter
对象的数组并且不知道它们是关于什么的时,我遇到了一些错误。
我的代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Critter {
private:
string crName;
public:
Critter(string = "Poochie");
string getName() const { return crName; }
};
Critter::Critter(string n) {
crName = n;
}
int main() {
Critter c[10] = { "bob","neo","judy","patrik","popo" }; //here
return 0;
}
错误:
E0415 - no suitable constructor exists to convert from "const char [4]" to "Critter"
...
4 more like this.
这段代码适用于朋友的Visual Studio 2017,但不适用于我的2019版本。
谢谢。
您拥有的初始化是针对字符串数组,针对您需要的对象:
Critter c[10] = {Critter("bob"), Critter("neo"), Critter("judy"),
Critter("patrik"), Critter("popo")};
或
Critter c[10] = {{"bob"}, {"neo"}, {"judy"}, //(*)
{"patrik"}, {"popo"}};
*
第二种方法归功于@drescherjm评论,然后是@dxiv的回答,两者都首先提到了它。
第二次初始化可能是您的朋友使用的,也许您忘记了大括号,IDE 版本差异在这里似乎无关紧要。
请注意,C++为固定大小的数组提供了一个容器,std::array
:
std::array<Critter, 10> c = {Critter("bob"), Critter("neo"),
Critter("judy"), Critter("patrik"), Critter("popo")};
附带说明一下:
你应该避免using namespace std;
Critter c[10] = { "bob","neo","judy","patrik","popo" };
这定义了const char *
数组。要使用这些字符串初始化Critter
数组,请执行以下操作:
Critter c[10] = { {"bob"}, {"neo"}, {"judy"}, {"patrik"}, {"popo"} };
[编辑] 有人指出,相同的答案首先发布在评论中,只是它隐藏在外部链接中,没有指示其背后的内容,我在发布上述内容之前没有看到。功劳归@drescherjm所以我将把它留在这里作为 CW。
string c[10] = {"bob","neo","judy","patrik","popo"};
是正确的。
{"bob","neo","judy","patrik","popo"}
是一个包含字符串元素的数组。
你需要做的
Critter c[10]={ Critter("bob"),Critter("neo"),Critter("judy"),Critter("patrik"),Critter("popo")};
C++一次只允许一个"用户定义的转换"。
您正在提供char const[N]
s(为了论证起见,我们称它们为char const*
s(,需要将其转换为std::string
s(在此上下文中算作"用户定义"(,需要转换为Critter
s。
这是两次转换,而不是一次。
恐怕这只是C++的限制。您必须在该初始化器中临时实例化字符串或Critter
。