0

我有一个文本文件 points.txt

由 Points/NotPoints , X ,Y 格式化

Points, [3, 3]
NotPoints, [0, 0]
Points, [4, 4]
NotPoints, [0, 0]

我想要做的是从文本文件中检索 X 值并将其放入向量中,然后按 ASC 或 DSC 顺序对 X 值进行排序。

我为我的问题找到了类似的帖子

www.stackoverflow.com/questions/7102246/sorting-a-vector-of-objects-in-c# =

但问题是,当我尝试在 main.cpp 中执行此操作时,

sort(pointsVector.begin(), pointsVector.end(),sortOrder()) ;

它显示一个错误,在 Points 类型的多个基类子对象中找到非静态成员 sortOrder。

请参阅下面的代码以了解我的实现。

我的任务的一些要求,

I must initialize int x as protected variable as there are other class inheriting it , 
I can't use struct therefore I am using get and set

代码

点数.h

#ifndef __Points__Points__
#define __Points__Points__
#include <iostream>

class Points {
    friend class main;

protected:
     int x;
     int y;

private:
     friend bool sortOrder (const Points & rhs, const Points & lhs);
public:
    Points() {
        x=0;
        y=0;
    };//default Constructor

    Points (int x , int y);
    int getX();
    int getY();

    void setX(int x);
    void setY(int y);

    bool sortOrder (const Point2D & rhs, const Point2D & lhs) {
        return lhs.x < rhs.x;
    }
};
#endif 

点数.cpp

#include "Points.h"

Points::Points(int x , int y) {
    setX(x);
    setY(y);

}

int Points::getX() {
    return x;
}

int Points::getY() {
    return y;
}

void Points::setX(int x)   {
    this->x = x;
}

void Points::setY(int y)   {
    this->y = y;
}

主文件

 #ifndef Points_main_h
 #define Points_main_h
 #include <iostream>
 #include "Points.h"
 #include <vector>

class main : public Points  {

private:
    int input;
    std::string type,line;
    std::string pointX, pointY;
    std::vector<Points> pointsVector;
 public:
    void mainMenu();
    void getPoint2DRecordsFromFile();
};
#endif 

主文件

 #include <iostream>
 #include "main.h"
 #include "Points.h"
 #include <fstream>
 #include <sstream>
 #include <string>
 #include <vector>
 #include <stdio.h>
 #include <algorithm>

class main outputMethod;

void main::getRecordsFromFile() {

    std::ifstream readFile;
    //put your text file name inside the ""
    readFile.open("points.txt");
    if (!readFile.is_open()) {
        std::cout <<" "<< std::endl;
        std::cout << "File Not Found!" << std::endl;
        std::cout <<" "<< std::endl;
    }
    else    {
        while (readFile.good()) {
            while(getline(readFile,line))   {
                std::stringstream iss(line);
                getline(iss, type,',');
                if(type == "Points")  {

                getline(iss, pointX,'[');
                getline(iss, pointX,',');

                getline(iss, pointY ,' ');
                getline(iss, pointY,']');

                Points pointsConsturctor(std::stoi(pointX),std::stoi(pointY));
                pointsVector.push_back(pointsConsturctor);
                }
            }
        }
    }
    readFile.close();

    /*error!
    Non static members sortOrder found in multiple base-class subobjects of type Points*/
    sort(pointsVector.begin(), pointsVector.end(),sortOrder());

    for (int i = 0; i<pointsVector.size(); i++) {
        std::cout << pointsVector[i].getX() << "," << pointsVector[i].getY() << std::endl;
    }  
}


void main::mainMenu() {

    std::cout << "1. Read data " << std::endl;
    std::cout << "2. sort " << std::endl;
    std::cin >> input;

    switch ( input ) {
        case 1:
            std::cout << "In Progress!" << std::endl;
            break;
        case 2:
            getRecordsFromFile();
            break;
        default:
            break;
        std::cin.get();
    }

}

int main()  {
    outputMethod.mainMenu();
}
4

4 回答 4

5

请注意,在Points类中,您已经定义了两次 sortOrder(作为友元函数和方法):

friend bool sortOrder (const Points & rhs, const Points & lhs);

bool sortOrder (const Point2D & rhs, const Point2D & lhs) {
    return lhs.x < rhs.x;
}
于 2013-11-11T09:32:18.440 回答
2

因为sortOrder是一个函数,当你这样做时

sort(point2DVector.begin(), point2DVector.end(),sortOrder()) ;

您实际上是在尝试调用该函数。由于您没有提供所需的参数,因此您将收到错误消息。而是不带括号传递它:

sort(point2DVector.begin(), point2DVector.end(), &Points::sortOrder) ;

另一个错误是它是一个成员函数,并且所有成员函数都有一个隐藏的第一个参数,即this函数中的指针,因此仅执行上述操作也不起作用。您要么必须使函数成为独立函数,要么使其成为static成员函数。

于 2013-11-11T09:30:50.657 回答
2

sortOrder当您实际将其定义为成员函数时,您将其声明为朋友。friend旨在让函数访问属于类本身的类。

此外,这两个声明的参数类型不同——一个接受两个Points,另一个接受两个Point2D——这种Point2D类型从何而来?

所以:

  • sortOrder函数放在类声明之外(或按照 Joachim Pileborg 的建议将其设为静态)
  • 更正参数类型
  • sortOrder在调用之后删除括号std::sort- 就像现在一样,您正在尝试调用该函数。
于 2013-11-11T09:31:42.583 回答
2

当您编写sortOrder()编译器时,您会认为您正在调用一个函数,但是对于这个参数,您真正需要的是函数或仿函数(一个像函数一样工作的类)。因此,您可以编写函数或仿函数,也可以使用 lambda 表达式。或者在最简单的情况下,您可以创建sortOrder一个静态函数并像这样调用它:

sort(point2DVector.begin(), point2DVector.end(),&Points::sortOrder)
于 2013-11-11T09:31:49.250 回答