1

我有一个类,它有一个字符串向量作为变量和一个构造函数,它接受输入来设置这个向量的大小。唯一的问题是向量中的元素根本没有设置默认值。这里有什么问题?尝试了调整大小和分配,但每次都以空白结束。

班级:

#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));
    }
4

4 回答 4

4

问题是push_back使用您的复制构造函数,但您的复制构造函数不会将任何内容复制到station.

由于您的数据成员可以安全复制,因此只需使用默认的复制构造函数。删除您定义的复制构造函数。

三者的规则是,如果需要定义析构函数,还需要定义复制构造函数和赋值运算符。但是,由于您不需要定义析构函数,因此该规则不适用于Lab该类。

于 2012-07-04T07:13:13.450 回答
2

您不会在复制构造函数中复制任何内容,您只需调整向量的大小station而不将任何值复制到其中。只需使用带有作为参数station的复制构造函数。labcpy.station但是您知道吗,无论如何您都不需要实现任何复制构造函数,因为编译器生成的构造函数在这里可以完美运行(因为它只是复制stationand 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)
    {
    }
};
于 2012-07-04T07:35:26.180 回答
2

代替:

station.resize(labcpy.station.size());

station = labcpy.station;

在您的复制构造函数中。您只是分配空间,而不是复制数据。只需使用向量的赋值运算符来复制数据。它还将处理重新调整大小。

附带说明:您可能希望避免使用数组运算符 [],因为它们不进行边界检查。

于 2012-07-04T07:21:20.163 回答
0

首先

    Lab(const Lab& labcpy)
    {
         station.resize(labcpy.station.size());
         id = labcpy.id;
    };

在这里您调整向量的大小,但您不向其中添加任何值。因此,如果您使用它来复制默认构造Lab,您只会更改大小,但不会将任何字符串值分配给新元素(可能只是初始化为空字符串)。其次,您还应该实现一个赋值运算符

于 2012-07-04T07:13:22.593 回答