Не могу скопировать из файла в вектор указателей на объекты - PullRequest
0 голосов
/ 08 марта 2019

Итак, у меня есть класс с именем CStudentEmploy, содержащий 3 переменные.

У меня есть другой класс CAnalizeData:CStudentEmploy

, который содержит вектор указателей vector<CStudentEmploy*>m_vData;

У меня также есть оператор istream:

friend istream& operator >> (istream& str,CStudentEmploy& obj)
    {
        str >> obj.m_strName >> obj.m_strFacNum >> obj.m_iMinutes;
        return str;
    }

Я хочу заполнить этот вектор из файла следующим образом:

CAnalizeData(const string &strFileName) {
        ifstream ifile(strFileName.data());
        copy(istream_iterator<CStudentEmploy*>(ifile), istream_iterator<CStudentEmploy*>(), back_inserter(m_vData));
    }

Этот способ работает, если я пытаюсь заполнить вектор объектов.

Я получаю ошибку:

Ошибка C2679 двоичного «>>»: не найден оператор, который принимает правый операнд типа «_Ty» (или нет приемлемого преобразования)

Я понимаю, что есть проблема с итератором, но не могу ее исправить. Спасибо.

Вот полный код:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <fstream>
#include <algorithm>
#include <istream>
using namespace std;
class CStudentEmploy {
private:
    string m_strName;
    string m_strFacNum;
    int m_iMinutes;
public:
    CStudentEmploy() {
        m_strName = "Empty";
        m_strFacNum = "Empty";
        m_iMinutes = 0;
    }
    CStudentEmploy(string strname,string strfacnum,int minutes) {
        m_strName = strname;
        m_strFacNum = strfacnum;
        m_iMinutes = minutes;
    }
    CStudentEmploy(const CStudentEmploy &obj) {
        m_strName = obj.m_strName;
        m_strFacNum =obj.m_strFacNum;
        m_iMinutes =obj.m_iMinutes;
    }
    int get_m_iMinutes() {
        return m_iMinutes;
    }
    CStudentEmploy operator =(const CStudentEmploy &obj) {
        this->m_strName = obj.m_strName;
        this->m_strFacNum = obj.m_strFacNum;
        this->m_iMinutes = obj.m_iMinutes;
        return *this;
    }

    bool operator <(const CStudentEmploy &obj)const {
        return m_iMinutes<obj.m_iMinutes;
    }
    CStudentEmploy operator +(const CStudentEmploy &obj) {
        this->m_iMinutes += obj.m_iMinutes;
        return *this;
    }
    friend ostream& operator << (ostream& str, const CStudentEmploy &obj)
    {
        str << "\nIme: " << obj.m_strName<< "\nF Nomer: " << obj.m_strFacNum << "\nMinuti:" << obj.m_iMinutes << endl;
        return str;
    }

    friend istream& operator >> (istream& str,CStudentEmploy& obj)
    {
        str >> obj.m_strName >> obj.m_strFacNum >> obj.m_iMinutes;
        return str;
    }
};
class CAnalizeData:CStudentEmploy {
private:
    vector<CStudentEmploy*>m_vData;
public:
    CAnalizeData(const string &strFileName) {
        ifstream ifile(strFileName.data());
        copy(istream_iterator<CStudentEmploy*>(ifile), istream_iterator<CStudentEmploy*>(), back_inserter(m_vData));
    }
    void Write() {
        vector<CStudentEmploy*>::iterator it = m_vData.begin();
        while (it != m_vData.end())
        {
            cout << *it++;
        }
    }
    void Sort() {
        sort(m_vData.begin(), m_vData.end());
    }
    double calcMean() {
        double avg = 0;
        vector<CStudentEmploy*>::iterator it = m_vData.begin();
        for (it = m_vData.begin(); it != m_vData.end(); it++) {
            avg += (*it)->get_m_iMinutes();
        }
        cout << "Average minutes is:";
        return avg / m_vData.size();
    }
};
int main() {
    CAnalizeData AB("Test.txt");
    AB.Sort();
    AB.Write();
    cout << AB.calcMean();
    cout << endl;   system("pause");
    return 0;
}

1 Ответ

0 голосов
/ 08 марта 2019

Возможно что-то с std::transform:

CAnalizeData(const string &strFileName) {
    ifstream ifile(strFileName.data());
    transform(istream_iterator<CStudentEmploy>(ifile),
      istream_iterator<CStudentEmploy>(), back_inserter(m_vData),
      [](const CStudentEmploy &e) { return new CStudentEmploy(e); });
}

Использование new там, так как я предполагаю, что объект был бы создан в стеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...