C++ 如何使用自定义类声明数组?
我试图用自定义类声明一个数组。当我向类中添加构造函数时,我的编译器抱怨“没有用于初始化名称[3]的匹配构造函数” 以下是我的节目:C++ 如何使用自定义类声明数组?,c++,arrays,constructor,C++,Arrays,Constructor,我试图用自定义类声明一个数组。当我向类中添加构造函数时,我的编译器抱怨“没有用于初始化名称[3]的匹配构造函数” 以下是我的节目: #include <iostream> using namespace std; class name { public: string first; string last; name(string a, string b){ first = a; last = b; } }; int main (i
#include <iostream>
using namespace std;
class name {
public:
string first;
string last;
name(string a, string b){
first = a;
last = b;
}
};
int main (int argc, const char * argv[])
{
const int howManyNames = 3;
name someName[howManyNames];
return 0;
}
#包括
使用名称空间std;
类名{
公众:
先串;
最后一串;
名称(字符串a、字符串b){
第一个=a;
last=b;
}
};
int main(int argc,const char*argv[]
{
howManyNames常数=3;
说出某人的名字[豪曼奈姆斯];
返回0;
}
我能做些什么来实现这一目标,我做错了什么 您需要一个能够创建类实例的。当前构造函数需要两个输入字符串参数
通常C++表示如果没有强的> <强> >构造函数,就有这样的构造函数(=默认的无参数构造函数)。通过使用两个参数声明第一个构造函数,您将覆盖此默认行为,现在您必须显式声明此构造函数
以下是工作代码:#include <iostream>
#include <string> // <-- you need this if you want to use string type
using namespace std;
class name {
public:
string first;
string last;
name(string a, string b){
first = a;
last = b;
}
name () // <-- this is your explicit parameterless constructor
{}
};
int main (int argc, const char * argv[])
{
const int howManyNames = 3;
name someName[howManyNames];
return 0;
}
您必须提供一个默认构造函数。同时,也要修复其他构造函数:
class Name
{
public:
Name() { }
Name(string const & f, string const & l) : first(f), last(l) { }
//...
};
或者,您必须提供初始值设定项:
Name arr[3] { { "John", "Doe" }, { "Jane", "Smith" }, { "", "" } };
后者在概念上更可取,因为没有理由让类具有“默认”状态的概念。在这种情况下,您只需为数组的每个元素提供适当的初始值设定项
<> > C++中的对象永远不能处于不明确的状态;如果你想一想,一切都应该变得非常清楚
另一种方法是使用动态容器,尽管这与您要求的不同:
std::vector<Name> arr;
arr.reserve(3); // morally "an uninitialized array", though it really isn't
arr.emplace_back("John", "Doe");
arr.emplace_back("Jane", "Smith");
arr.emplace_back("", "");
std::vector<Name> brr { { "ab", "cd" }, { "de", "fg" } }; // yet another way
std::向量arr;
arr.reserve(3);//从道德上讲,这是一个“未初始化的数组”,尽管它实际上不是
安置回(“约翰”、“多伊”);
回到(“简”、“史密斯”);
向后定位(“,”);
向量brr{{“ab”,“cd”},{“de”,“fg”};//另一种方式
要默认初始化T
s数组,T
必须是默认可构造的。通常,编译器会免费为您提供一个默认构造函数。但是,由于您自己声明了构造函数,编译器不会生成默认构造函数
您的选择:
- 如果有意义的话,在name中添加一个默认构造函数(我不这么认为,但我不知道问题域)李>
- 声明时初始化数组的所有元素(您可以这样做,因为
是一个聚合)name
- 改用
,并且仅在构建元素时添加元素std::vector
class name {
public:
string first;
string last;
name() {
}
name(string a, string b){
first = a;
last = b;
}
};
你们班:
class name {
public:
string first;
string last;
name() { } //Default constructor.
name(string a, string b){
first = a;
last = b;
}
};
具有需要两个字符串参数的显式构造函数。没有显式编写构造函数的类获得不带参数的默认构造函数。添加显式构造函数会阻止编译器为您生成默认构造函数
因此,如果希望创建未初始化对象的数组,请向类中添加一个默认构造函数,以便编译器知道如何在不提供这两个字符串参数的情况下创建它们-请参见上面的注释行。要创建对象数组,对象需要一个不带任何参数的构造函数(这会创建对象的默认形式,例如,两个字符串都为空)。这就是错误消息的意思。编译器会自动生成一个构造函数,该构造函数创建一个空对象,除非存在任何其他构造函数 如果将数组元素创建为空(在这种情况下,成员获取其默认值,在本例中为空字符串),则应: -编写一个空构造函数:
class name {
public:
string first;
string last;
name() { }
name(string a, string b){
first = a;
last = b;
}
};
-或者,如果不需要,请删除现有构造函数
如果类的“空”版本没有意义,则没有好的解决方案在编译时为数组的所有元素提供初始化参数。您可以:
- 让构造函数创建一个空版本的类,以及一个执行真正初始化的
函数init()
- 使用
,在初始化时创建对象并将其插入向量
,可以使用向量
或循环,并相信在编译时不这样做并不重要vector::insert
- 如果对象也无法复制,则可以使用指向该对象的智能指针数组/向量,并在初始化时分配它们
- 如果你可以使用C++11,我认为(?)你可以使用初始化器列表来初始化向量并初始化它(我不确定这是否适用于任何构造函数,或者仅当对象是由另一种类型的单个值创建时)。例如:
std::vector v={“xyzy”、“plugh”、“abracadabra”};
“Pod’/P>Pod可能处于一个不明确的状态;”FrdodoFLUTE:它们不是“不明确的”——它们“未初始化”,概念上是明确的,语义是不能读取的。好,那么什么是一个可能处于不确定状态的例子?“FrdodoFLUF:好吧,正如我所说的,C++不能做到这一点。假设这类似于创建一个“未构造”对象的静态数组——对象未处于定义良好状态的任何对象(例如,在没有完成构造函数的情况下尝试将内存作为类类型对象进行寻址)。也许新的无约束工会提供了更多的例子;如果你没有按照正确的顺序运行你自己的析构函数,那里有很多UB;暗示禁止驾驶进入定义错误状态的方式。呃,
resize
需要默认的可构造类型。
class name {
public:
string first;
string last;
name() { } //Default constructor.
name(string a, string b){
first = a;
last = b;
}
};
class name {
public:
string first;
string last;
name() { }
name(string a, string b){
first = a;
last = b;
}
};
std::vector<std::string> v = { "xyzzy", "plugh", "abracadabra" };