vector .push_back方法由于拷贝构造函数而没有将类对象传递给向量

时间:2014-01-15 02:42:30

标签: c++ debugging vector stl

我有一个班级cashier,其中有3个属性: ID 密码尝试,标准GET& SET方法

//Header file

#ifndef CASHIER_H
#define CASHIER_H
#include <string>
using namespace std;


class cashier 
{
public:
    cashier();
    cashier(const cashier& orig);
    virtual ~cashier();

        void setID(string);
    string getID();

    void setPassword(string);
    string getPassword();

    void settries(int);
    int gettries();

private:
    string ID;
    string Password;
    int tries;



};

#endif  /* CASHIER_H */

cashier.cpp文件

#include "cashier.h"

cashier::cashier() 
{

}

cashier::cashier(const cashier& orig) 
{

}

cashier::~cashier() 
{

}

void cashier::setID(string value)
{
    this->ID = value;
}

void cashier::setPassword(string value)
{
    this->Password = value;
}

string cashier::getID()
{
    return this->ID;
}

string cashier::getPassword()
{
    return this->Password;
}

void cashier::settries(int value)
{
    this->tries=value;
}
int cashier::gettries()
{
    return this->tries;
}

在我的主文件中,我试图从文本文件中读取并将值存储在收银员c中并将其推入我的矢量cashier_all

#include <iostream>
#include "cashier.h"
#include <fstream>
#include <vector>
int main()
{

fstream afile;
        char rubbish[100];

        afile.open("cashier.txt",ios::in);

        afile.getline(rubbish,100); //read in first line

        vector <cashier> cashier_all;

            cashier c;
            string temp_id;
            string temp_password;
            int temp_tries;


        while(afile>>temp_id)
        {
            afile>>temp_password;

            afile>>temp_tries;

            c.setID(temp_id);
            c.setPassword(temp_password);
            c.settries(temp_tries);

            cashier_all.push_back(c); //c is not being pushed into the vector
                                      // for some unknown reason


        }

            vector<cashier>::iterator v1;
            vector<cashier>::iterator v2;
            v1 = cashier_all.begin();
            v2 = cashier_all.end();

            while (v1 != v2)
            {
                cout<<v1->getID()
                    <<endl
                    <<v1->getPassword()
                    <<endl
                    <<v1->gettries();
                v1++;


            }

            system("PAUSE");

}

cashier.txt

CashierID               password        tries
001                     def             0
002                     ghi         0
003                     jkl         0

检查我的调试器,错误发生在cashier_all.pushback,它没有将c推入vector cashier_all ,如果你不相信我,你可以自己尝试

编辑:删除所有构造函数后,它可以正常工作

我不明白为什么复制构造函数会影响收银员进入cashier_all,有人可以向我解释一下吗?

2 个答案:

答案 0 :(得分:3)

摆脱生成方法的不必要实现,例如你的拷贝构造函数:你的拷贝构造函数与默认构造函数的作用相同。但是,它应该复制对象。删除它将导致复制构造函数执行此操作。作为额外的奖励,编译器还会为您生成移动构造函数。

将对象插入容器时,对象被复制(如果它是临时对象,则移动):C ++基于,而不是基于引用!

答案 1 :(得分:3)

您当前的复制构造函数不是真正复制对象。一个体面的实施将是:

cashier::cashier(const cashier& orig) 
    : ID(origin.ID)
    , Password(origin.Password)
    , tries(origin.tries)
    {}

但是C ++默认定义了这种构造函数,因此您不需要编写一个构造函数。您的默认构造函数和析构函数也是如此。

我也非常害怕:

  

标准GET&amp; SET方法

你在那里提到过的短语。没有标准 GET和SET方法这样的东西。你的会员职能完全没有意义存在。

在这种情况下,您只需使用结构:

struct cashier {
    std::string ID;
    std::string Password;
    int tries;
};

你能看到C ++的美丽吗?请记住,封装 意味着:添加一堆getter和setter。