我有一个类,它有一个字符串向量作为变量和一个构造函数,它接受输入来设置这个向量的大小。唯一的问题是没有为向量中的元素设置默认值。这有什么不对?尝试调整大小和分配,但每次最终都是空白。
类别:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Lab
{
private:
vector<string> station;
int id;
public:
Lab()
{
station[0] = "Empty";
id = 0;
};
Lab(int ID, int size)
{
station.assign(size, "Empty");
id = ID;
};
Lab(const Lab& labcpy)
{
station.resize(labcpy.station.size());
id = labcpy.id;
};
设置矢量大小的主要位置:
#include <fstream>
#include "lab.h"
using namespace std;
int main(int argc, char* argv[])
{
ifstream labnumber_file(argv[1]);
vector<Lab> lab_v;
int labnum;
int usernum;
while(!labnumber_file.eof())
{
labnumber_file >> labnum;
labnumber_file >> usernum;
lab_v.push_back(Lab(labnum, usernum));
}
答案 0 :(得分:4)
问题是push_back
使用了您的复制构造函数,但您的复制构造函数不会将任何内容复制到station
。
由于您的数据成员可以安全复制,因此只需使用默认的复制构造函数即可。删除您定义的复制构造函数。
规则三是如果需要定义析构函数,还需要定义复制构造函数和赋值运算符。但是,由于您不需要定义析构函数,因此该规则不适用于Lab
类。
答案 1 :(得分:2)
替换:
station.resize(labcpy.station.size());
与
station = labcpy.station;
在你的拷贝构造函数中。您只是分配空间,但不是复制数据。只需使用向量的赋值运算符来复制数据。它还将处理重新调整大小。
旁注: 您可能希望避免使用数组运算符[],因为它们不进行边界检查。
答案 2 :(得分:2)
您不复制复制构造函数中的任何内容,只需调整向量station
的大小,而不复制任何值。只需使用station
的复制构造函数和labcpy.station
作为参数。但是你知道吗,你不需要实现任何拷贝构造函数,因为编译器生成的一个在这里工作得很好(因为它只复制station
和id
)。
此外,您的默认构造函数会调用未定义的行为,因为您访问station[0]
时station
没有任何元素。
最后但并非最不重要的是,您应该使用初始化列表,而不是执行默认构造,然后进行分配。 (并且不要在函数定义之后加分号。)
class Lab
{
private:
vector<string> station;
int id;
public:
Lab()
: station(1, "Empty"), id(0)
{
}
Lab(int ID, int size)
: station(size, "Empty"), id(ID)
{
}
};
答案 3 :(得分:0)
首先
Lab(const Lab& labcpy)
{
station.resize(labcpy.station.size());
id = labcpy.id;
};
这里你调整矢量大小,但你不添加任何值。因此,如果您使用它来复制默认构造的Lab
,您将只是更改大小,但不会将任何字符串值分配给新元素(可能只是初始化为空字符串)。其次,您还应该实现赋值运算符