2012-03-12 7 views
1

のようなタイプのものがあると聞きましたが、Objectメンバーを指しています。ここでは、Object :: *

class Point{float x, y;}; 
float Point::*p2 = &Point::x; 

ですが、私は前に使用し、本当にあなたがそれのいずれかの経験を持っているit.Do使用する一部のボディを疑問に思うことがありますか?

+0

ブーストのようなライブラリを見てください::侵入 – PlasmaHH

答えて

2

これは、コードを複製せずにメンバーに同じ処理を適用する場合に便利です。

vector<Point> points; // suppose it has many elements 

vector<double> Project(const vector<Point> points, int Point::* coord) 
{ 
    vector<double> result; 
    for (auto& p: points) 
     result.push_back(p.*coord); 
    return result; 
} 

// usage: 
vector<double> Xs = Project(points, &Point::x); 
vector<double> Ys = Project(points, &Point::y); 

高速代理人(link)などの他の多くの用途もあります。

+0

興味深い..soは "for(auto&p:points)"コード –

+0

@ user974349:これはGCC 4.5+とMSVC 11(ベータ版)で利用可能なC++ 11の機能です。 MSVC 10では 'std :: for_each(begin(points)、end(points)、[&result](const Point&p){result.push_back(p);}'を好むかもしれません。 –

-1
class Point { 
    public: //public variables (can be accessed by outsider) 
    float x, y; 

    private: //private variables if you have any 

}; 

あなたがPoint pをするだろう、とあなたはちょうどあなたがstructオブジェクトの場合と同様に、p.xp.yを行うことによって要素にアクセスできるオブジェクトを作成します。

あなたはクラスポインタを作成するには、Point *pを行い、あなたがx, yにアクセスしたい場合は、今、あなたがp->ap->bを行うだろうしたい場合。別のオブジェクトPoint tがあり、tのアドレスをpに割り当てる場合は、p = &tを実行できます。

+1

私はあなたが質問のポイントを逃していると思います。これはメンバーへのアクセスであり、メンバーへのポインタではありません。 –

0

これらはpointers to class membersであり、さまざまなファンクタクラス(例:boost::functionまたはstd::function)を実装するために使用されます。

関連する問題