2

はじめに:

私のプログラムでは、groupオブジェクトにはstd::vectorポリゴン (リングと穴) がいっぱいあり、polygonオブジェクトにstd::vectorは点がいくつかあります。実際には、クラスはもっと複雑です。ここでは、問題を説明するためにクラスを削除しました。

問題:

point対応するグループ オブジェクト内から 'sx 座標と y 座標を変更できるようにしたいと考えています。以下の には、これを達成しようとgroup.cppするダミー関数が呼び出されています。void Group::tryChangingAllX()ただし、show()後でグループを呼び出しても、ポリゴンのポイントの座標に変更はありません。

参照/ポインターを使用する必要があると思いますが、正しい方向に微調整する必要があります。

ポイント.cpp:

#include "point.h"
#include <iostream>
Point::~Point(){}
Point::Point(int x, int y){
    _x = x;
    _y = y;
}
void Point::show(){std::cout << "(" << x() << "," << y() << ")";}
void Point::x(int x){_x = x;}
void Point::y(int y){_y = y;}
int Point::x(){return _x;}
int Point::y(){return _y;}

ポイント.h:

#ifndef POINT_GUARD
#define POINT_GUARD
class Point{
    int _x;
    int _y;
    public:
        Point(int x, int y);
        ~Point();
        void show();
        int x();
        int y();
        void x(int x);
        void y(int y);  
};
#endif

ポリゴン.cpp:

#include "polygon.h"
#include "point.h"
#include <iostream>
#include <vector>

Polygon::~Polygon(){}
Polygon::Polygon(){}
std::vector<Point> Polygon::points(){return _points;}
Polygon::Polygon(std::vector<Point> points){_points = points;}
void Polygon::show(){
    std::cout << "Points: ";
    for(std::vector<Point>::size_type i = 0; i != _points.size(); i++) {
        _points[i].show();
    }
}

ポリゴン.h:

#ifndef POLYGON_GUARD
#define POLYGON_GUARD

#include <vector>
#include "point.h"

class Polygon{
    //private:
    std::vector<Point> _points;
    public:
        ~Polygon();
        Polygon ();
        Polygon(std::vector<Point> points);
        std::vector<Point> points();
        void show();
};
#endif

group.cpp:

#include <iostream>
#include <vector>
#include "group.h"
#include "polygon.h"
Group::~Group(){}
Group::Group(std::vector<Polygon> polygons){
    _ring = polygons.front();
    polygons.erase(polygons.begin());
    _holes = polygons;
}
void Group::tryChangingAllX(){
    std::vector<Point> points = _ring.points();
    for(std::vector<Point>::size_type i = 0; i != points.size(); i++) {
        points[i].x(15);
    }
}
void Group::show(){
    _ring.show();
    if(_holes.size()>0){
        for(std::vector<Polygon>::size_type i = 0; i != _holes.size(); i++) {
            _holes[i].show();
        }
    }
}

group.h:

#ifndef GROUP_GUARD
#define GROUP_GUARD

#include <vector>
#include "polygon.h"

class Group{
    Polygon _ring;
    std::vector<Polygon> _holes;
    public:
        ~Group();
        Group(std::vector<Polygon> polygons);
        void show();
        void tryChangingAllX();

};
#endif

ありがとう!

4

3 に答える 3

5

関数

std::vector<Point> points();

で返すため、呼び出すと、メンバーのコピーが取得されます。に変更する必要があります

std::vector<Point>& points();

これを行った後

std::vector<Point> points = _ring.points();

戻り値のコピーも作成します。で実際のメンバーを参照するには、次の_ringように変更します。

std::vector<Point>& points = _ring.points();

それはそれを行う必要があります。

std::vector不要なコピーを防ぐために、const 参照で渡す必要があることに注意してください。

Polygon(const std::vector<Point>& points); 

クラスを変更しないメソッドを作成することを検討してくださいconst

int x() const;  
于 2012-11-26T04:20:42.553 に答える
1

これはまさにあなたの問題です。元のポイント自体への参照ではなく、ポイントのコピーを取得しています。

ポリゴン.cpp:

値ではなく参照でポイントを返す:

std::vector<Point>& Polygon::points(){return _points;} // note the '&' in the return

group.cpp:

コピーではなく、ポイントへの参照を取得する

std::vector<Point>& points = _ring.points(); // note the '&' in what you're getting
于 2012-11-26T04:22:42.767 に答える
0

Luchianとloriによって投稿された回答は技術的に正しいです。しかし、私が指摘したい設計上の考慮事項があります。

aを返すreferenceと、誰でもオブジェクトprivateの一部を変更できPolygonます。Group設計上、クラスにこれを実行させたいだけです。の作成を検討してGroupください。その後、のプライベートビットにアクセスできます。これにより、全体としてより緊密なカプセル化が保証されます。friendPolygonGroupPolygon

ポリゴン内.h

friend class Group;

group.cpp

void Group::tryChangingAllX()
{
    for(std::vector<Point>::size_type i = 0; i != _ring._points.size(); i++)
    {
        _ring._points[i].x(15);
    }
}
于 2012-11-26T04:30:16.703 に答える