0

我正在尝试用 x 和 y 值填充我的向量。但它似乎没有添加,只是覆盖了第一个。

主文件

#include <iostream> 
#include "Point.h"

using namespace std;
int x,y;
Point point;
string options;
void someMethods();
int main()
{   
    cout << "Please Enter x-Cordinate"<< endl;
    cin >> x;
    cout << "Please Enter y-Cordinate" << endl;
    cin >> y;
    cout << "Enter cords again? yes/no"<< endl;
    cin >> options;
    while (options == "yes") {

        cout << "Please Enter x-Cordinate"<< endl;
        cin >> x;
        cout << "Please Enter y-Cordinate" << endl;
        cin >> y;
        cout << "Enter cords again? yes/no"<< endl;
        cin >> options;
    }


    if(options == "no") {
        Point Point(x,y);
        Point.someMethods();
       // break;
    }
}

点.h

#ifndef Point_Point_h
#define Point_Point_h
#include <vector>

class Point {
private:
      int x,y;

public : 

      Point() {
       x = 0;
       y = 0;
      } //default consrructor


      Point(int x,int y);
      int getX();
      int getY();
      void setX(int x);
      void setY(int y);
      std::vector<Point> storeData;
      void someMethods();

};    

#endif

点.cpp

#include <iostream>
#include "Point.h"
using namespace std;


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

}  

int Point::getX() {
  return x;
}
int Point::getY() {
  return y;
}

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

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


void Point::someMethods() {
x = getX();
y = getY();

Point Point(x,y);
storeData.push_back(Point);

   for (int i=0; i<storeData.size(); i++) {
    cout << "X "<< storeData[i].getX() <<"Y " << storeData[i].getY() << endl;
   }
// do some methods here after getting the x and y cords;
}  

我怎样才能做到,例如(我输入 x 和 y 3 次,比如说 1,1 2,2 3,3 )

然后它将输出

X: 1,Y: 1
X: 2,Y: 2
X: 3,Y: 3
4

3 回答 3

2
int main()
{
    // don't need global variables, just define local ones here
    int x,y;
    Point point;
    string options;

    // You shouldn't store the vector of Points in the Point class itself.
    // It doesn't have anything to do with a Point. classes should generally
    // only contain relevant information (ex. Point contains only x and y coords).
    vector<Point> pointsVector;

    // do-while will do the contents of the loop at least once
    // it will stop when the while condition is no longer met
    do
    {
        cout << "Please Enter x-Cordinate"<< endl;
        cin >> x;
        cout << "Please Enter y-Cordinate" << endl;
        cin >> y;

        pointsVector.push_back(Point(x, y));

        cout << "Enter cords again? yes/no"<< endl;
        cin >> options;
    } while (options == "yes")

    // don't really need to check if options is "no"
    // if you have exited the do/while loop above, the assumption is that you don't 
    // want to enter more coordinates.
    doSomethingWithTheVectorOfPoints(pointsVector);

    return 0;
}

在函数doSomethingWithTheVectorOfPoints中,您可以放置​​用于输出 X 和 Y 坐标的代码。(您也可以直接在 main 函数中循环遍历向量。)

此外,您可以在 Point 类中添加一个名为 ToString 或 Print 的成员函数来为您完成工作。

编辑:我实际上并没有编译它,只是为了让您了解如何重写代码。

于 2013-10-11T17:39:57.493 回答
0

你应该有:

  • 没有全局变量
  • 支持流输入(输出)的点类
  • 点类之外的存储数据(为什么差点要管理它?)
  • 带验证的流输入。

例子:

#include <iostream>
#include <stdexcept>
#include <sstream>
#include <vector>

struct Point {
    int x;
    int y;
};

std::istream& operator >> (std::istream& in, Point& point) {
    return in >> point.x >> point.y;
}

typedef std::vector<Point> PointStorage;

int main()
{
    PointStorage point_storage;
    Point point;
    while(true) {
        std::cout << "Please enter X and Y xordinates or 'no' to stop input" << std::endl;
        std::string line;
        if( ! std::getline(std::cin, line))
            throw std::invalid_argument(line);
        else {
            std::istringstream point_input(line);
            // Skip leading white spaces, read a point, skip trailing white apace
            // and ensure no additional character is left.
            if(point_input >> point >> std::ws && point_input.eof()) {
                point_storage.push_back(point);
            }
            else {
                std::string no;
                std::istringstream no_input(line);
                // Skip leading white spaces, read "no", skip trailing white apace
                // and ensure no additional character is left.
                if(no_input >> no >> std::ws && no_input.eof() && no == "no") {
                    break;
                }
                throw std::invalid_argument(line);
            }
        }
    }
    for(PointStorage::const_iterator pos = point_storage.begin();
        pos != point_storage.end();
        ++pos)
    {
        std::cout << pos->x << ", " << pos->y << '\n';
    }
    return 0;
}

注意:抛出异常可能是一个错误的决定,但它简化了示例。

于 2013-10-11T18:21:23.647 回答
-1

每次输入“否”时,您都会使用最终坐标重新创建对象。Point这就是为什么你只保留最后一对。

在不相关的注释中,您可能应该显着简化代码。对象没有理由Point首先保留对象向量Point。您可能希望在此处保留原始坐标的历史记录/序列,并具有以下内容:

Point mypt;

while (options == "yes") {
    mypt.AddCoords(x, y);
    // read more coords/options
}

// do stuff on filled mypt object
于 2013-10-11T17:11:57.637 回答