2012-07-04 42 views
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)); 
    } 
+0

您是否为Lab实现了赋值运算符? – mathematician1975

+0

为什么你不使用operator =? – hamed

+3

你的默认构造函数是越野车。 “station”应该初始化为首先接受1个元素。 – jxh

回答

2

替换:

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

station = labcpy.station; 
在你的拷贝构造函数

。您只分配空间,但不复制数据。只需使用矢量的赋值操作符来复制数据。它也将处理重新调整大小。

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

+0

这解决了这个问题。谢谢!我猜Eclipse的默认拷贝构造函数并不理想。 – postelrich

4

的问题是,push_back使用您的拷贝构造函数,但你的拷贝构造函数没有任何东西复制到station

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

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

+0

我摆脱了我的拷贝构造函数,并做了如上面基督徒所说的声明,但仍然以空白结束,而不是空着...... – postelrich

0

首先

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

这里你调整的载体,但你不要添加任何值给它。所以如果你使用这个来复制一个默认构造的Lab,你只需要改变它的大小,但是不要给任何字符串赋值给新的元素(可能只是初始化为空字符串)。其次,你还应该实现一个赋值运算符

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) 
    { 
    } 
}; 
+0

谢谢,我忘记了如何正确编写构造函数。不幸的是,它仍然不起作用 – postelrich