如何初始化对象数组?

How can I initialize an array of objects?

我已经编写了这段代码,但是当我尝试初始化一个 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"}}; 

*This second method is credited to followed by , both mentioned it first.

这二次初始化可能是你朋友用的,可能你忘记了大括号,IDE版本差异在这里似乎不相关

请注意,C++ 为固定大小的数组提供容器,std::array:

std::array<Critter, 10> c = {Critter("bob"), Critter("neo"),
                             Critter("judy"), Critter("patrik"), Critter("popo")};

旁注:

You should avoid using namespace std;

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++ 一次只允许一个 "user-defined conversion"。

您提供的是 char const[N]s(为了便于讨论,我们称它们为 char const*s),需要将其转换为 std::strings(算作 "user-defined" 在这种情况下),需要变成 Critters.

这是两次转化,而不是一次。

恐怕这只是 C++ 的限制。您必须在该初始化程序中临时实例化字符串或 Critters。

Critter c[10] = { "bob","neo","judy","patrik","popo" };

这里定义了一个const char *的数组。要用这些字符串初始化 Critter 的数组,而是:

Critter c[10] = { {"bob"}, {"neo"}, {"judy"}, {"patrik"}, {"popo"} };


[ EDIT ] 有人指出,同样的答案最初是在评论中发布的,只是它隐藏在外部 link 中,没有任何迹象表明它背后是什么,我发上面的之前没看到。感谢@drescherjm,所以我将把它留在这里作为 CW。