Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用自定义类声明数组?_C++_Arrays_Constructor - Fatal编程技术网

C++ 如何使用自定义类声明数组?

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

我试图用自定义类声明一个数组。当我向类中添加构造函数时,我的编译器抱怨“没有用于初始化名称[3]的匹配构造函数”

以下是我的节目:

#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" };