我有一个文本文件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()) ;
它显示了一个错误,非静态成员sortOrder在Points类型的多个基类子对象中找到。
请参阅下面的代码,了解我的实施情况。
我的任务的一些要求,
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
代码
Points.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
Points.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;
}
main.h
#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
的main.cpp
#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();
}
答案 0 :(得分:5)
请注意,在课程积分中,您已定义 sortOrder两次(作为友元函数和方法):
friend bool sortOrder (const Points & rhs, const Points & lhs);
bool sortOrder (const Point2D & rhs, const Point2D & lhs) {
return lhs.x < rhs.x;
}
答案 1 :(得分:2)
由于sortOrder
是一个函数,所以
sort(point2DVector.begin(), point2DVector.end(),sortOrder()) ;
您实际上是在尝试调用该函数。由于您未提供所需的参数,因此会出现错误。而只是在没有括号的情况下传递它:
sort(point2DVector.begin(), point2DVector.end(), &Points::sortOrder) ;
另一个错误是它是一个成员函数,并且所有成员函数都有一个隐藏的第一个参数,它是函数中的this
指针,所以只是执行上述操作也不起作用。您必须使该功能成为一个独立的功能,或使其成为static
成员功能。
答案 2 :(得分:2)
当您将sortOrder
实际定义为成员函数时,您宣布friend
为朋友。 Points
旨在为函数提供对不类本身的类的访问权。
此外,两个声明在参数类型上有所不同 - 一个需要两个Point2D
,另外两个Point2D
- 这个sortOrder
类型来自哪里?
所以:
sortOrder
函数放在类声明之外(或按照Joachim Pileborg的建议使其静态化)std::sort
来电中{{1}}后的括号 - 就像现在一样,您正试图调用该功能。答案 3 :(得分:2)
当你编写sortOrder()
时,编译器认为你正在调用一个函数,但是你真正需要的是一个函数或一个函数(一个类似函数的类)。因此,您可以编写函数或函子或使用lambda表达式。或者在最简单的情况下,您可以将sortOrder
设为静态函数,并将其命名为:
sort(point2DVector.begin(), point2DVector.end(),&Points::sortOrder)