矢量调整大小/分配不添加默认值

时间:2012-07-04 07:04:06

标签: c++ vector constructor

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

类别:

#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 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

替换:

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

station = labcpy.station;

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

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

答案 2 :(得分:2)

您不复制复制构造函数中的任何内容,只需调整向量station的大小,而不复制任何值。只需使用station的复制构造函数和labcpy.station作为参数。但是你知道吗,你不需要实现任何拷贝构造函数,因为编译器生成的一个在这里工作得很好(因为它只复制stationid)。

此外,您的默认构造函数会调用未定义的行为,因为您访问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,您将只是更改大小,但不会将任何字符串值分配给新元素(可能只是初始化为空字符串)。其次,您还应该实现赋值运算符