Перегружен istream >> оператор не работает внутри класса - PullRequest
0 голосов
/ 02 апреля 2020

Я совершенно новичок в c ++ в целом, но определенно новичок в классе topi c и так далее, и я обнаружил проблему, которая никак не может быть решена. Чтение подобных постов мне не помогло, поэтому я решил спросить Вас. Мне нужно два класса (на данный момент, по крайней мере, один рабочий ...) в каждом из них конструктор, который будет создавать вектор моих структур и загружать в него данные из файла .txt. У меня это работало в немного другой конфигурации, где не было классов и структур, которые были определены чуть выше основного веселья c, все в одном файле, но теперь я застрял. Некоторые «cout» предоставляют мне информацию о том, где выполняется код, и где бы он ни был.

Скажите, что мне нужен класс со структурой внутри (ниже приведен только пример), вектор этих структур и конструктор, который заполняет вектор значениями из файла .txt. Я перегрузил оператор из std :: istream и использовал функцию getData для чтения файла, и он работал нормально, пока я не поместил все в класс, поэтому я верю, что проблема где-то в операторе перегрузки друга (??? - не уверен, как вызвать это правильно). Я вставляю весь код ниже.

main. cpp

#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <fstream>
#include <math.h>
#include "PointCoord.hpp"

int main()
{
                                std::string hf_fileName = "DIT_hf_xy.txt";
                                std::string If_fileName = "DIT_If_xy.txt";
                                std::string coef_fileName = "constants.txt ";//"constants.txt";
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PointCoord hf("HF method",hf_fileName);
std::cout<< hf.getName();
hf.printVec();


    return 0;
}

PointCoord.hpp

#ifndef POINTCOORD_H
#define POINTCOORD_H

#include<vector>
#include<string>
#include<istream>

class PointCoord
{
    public:
        struct st_point
    {
        double x;
        double y;
    }Point;

        void getData(std::string m_filename);//,std::vector<PointCoord::st_point> &data);
        PointCoord(std::string m_name, std::string m_filename);
        void printVec();
        std::string getName();
        friend std::istream& operator>>(std::istream& is,  PointCoord::st_point& Point);
private:
    std::string name;
    std::vector<st_point> dataVec;
};
#endif // POINTCOORD_H

PointCoord. cpp

#include "PointCoord.hpp"
#include <iostream>
#include <fstream>
#include <iterator>
#include <string>
PointCoord::PointCoord(std::string m_name, std::string m_filename)
:name(m_name)
{

    PointCoord::getData(m_filename);//,dataVec);
    std::cout<<"File " + m_filename + " loaded." <<std::endl;
}

    std::istream& operator
     >>(std::istream& is, PointCoord::st_point& Point)
{
     is >> Point.x >> Point.y;

    return is;
}


void PointCoord::getData(std::string m_filename)//,std::vector<PointCoord::st_point> &data)
{
    std::cout << "getData1" << std::endl;
    std::ifstream ifs(m_filename);
    if (ifs) {
            std::cout << "getData2" << std::endl;
        std::copy(std::istream_iterator<st_point>(ifs),
                    std::istream_iterator<st_point>(),
                    std::back_inserter(dataVec));
    std::cout << "getData3" << std::endl;
                //std::cout << data.back().x << std::endl;
    }
    else {
        std::cerr << "Couldn't open " << m_filename << " for reading\n";
    }
}

void PointCoord::printVec()
{
        std::cout<< "Parametry, rozmiar wektora:" <<dataVec.size() <<std::endl;
    for (int i=0; i<dataVec.size();i++)
        std::cout << "x = " << dataVec[i].x << ", y = " <<dataVec[i].y << std::endl ;
}

std::string PointCoord::getName()
{
    return name;
}

Пример файла для чтения: -10,0224 3,1909 -9,9096 3,199 -9,7788 3,2109 -9, 7072 3,22E-09 -9,5994 3,24E-09 -9,491 3,26E-09 -9,393 3,28E-09 -9,3098 3,29E-09 -9,2104 3,32E-09 -9, 1008 3,34E-09 -8,9918 3,36E-09 -8,8952 3,38E-09 -8,792 3,40E-09 -8,729 3,42E-09 -8,5822 3,44E-09 -8, 5034 3,46E-09 -8,4136 3,49E-09 -8,2986 3,51E-09 -8,1934 3,53E-09

В качестве вывода я получаю все команды, кроме вектора пусто, несмотря на вызов функции getData. Надеюсь, вы дадите мне подсказку.

Спасибо

...