2012-10-25 56 views
2

我感到困惑使用二進制運算符<比較一個指向成員的指針?

class Point3d{ 
    protected: 
     //.. 
public: 
    float x; 
     static list<Point3d*> *freeList; 
public: 
    float y; 
    static const int chunkSize = 250; 
public: 
    float z; 

}爲什麼不能比擬指向成員;
和模板:

template< class class_type, class data_type1, class data_type2 > 

char* access_order(data_type1 class_type:: *mem1, data_type2 class_type:: *mem2) 
{ 

    return 
     mem1 < mem2 ? 
     "member 1 accurs first": 
     "member 2 accurs first"; 
} 

當我打電話給access_order象下面這樣:

access_order(&Point3d::z, &Point3d::y); 

的G ++報道:

"invalid operands of types ‘float Point3d::*’ and ‘float Point3d::*’ to binary ‘operator<’" 

有沒有辦法比較指針成員,我的意思是不平等的比較,以及如何?

+0

你不應該使用操作比較指針一樣的道理< –

+0

@FrerichRaabe我不認爲這是一個duplica te,因爲他在詢問有關數據成員的指針,而不是指向成員函數的指針。 (另外,你引用的主要答案是不正確的。) –

+0

@JamesKanze:對不起,我誤解了 - 我還以爲另一個問題是「指向成員」。我同意這不是重複的。我可以在這裏恢復我的關閉請求嗎? –

回答

0

如果三維點重載<然後尊重他們,並做比較,

回報 * MEM1 < * MEM2? 「會員1第一次應付」: 「會員2先生應付」;

或更改簽名

字符* access_order(data_type1 class_type :: & MEM1,data_type2 class_type :: & MEM2) 字符* access_order(data_type1 class_type :: MEM1,data_type2 class_type :: MEM2)

你想對實際內存地址做比較嗎?

+0

當然,我只是想測試/檢查C++內存模型,並且非常感謝~~~~ – Fly

1

出於同樣的原因,你不能比較一般的指針。支持訂單的唯一 比較是如果兩個數據指針指向 到同一個數組中。否則,比較的結果是未指定的 ;不要求編譯器以任何合理的方式使操作員「工作」 。 (確保這裏的總訂單需要在某些體系結構上進行額外的 計算。)由於沒有任何情況,您可以獲得 成員指針的指定結果,因此標準不允許 作爲運算符的參數。

如果您需要總訂購,std::less et al。保證提供 吧。包括,如果我正確理解標準,會員指針。 (儘管提供指向成員函數 的指針的總次序可能會非常昂貴。)然而,即使如此,這種次序 可能是任意的;當然不需要在內存中反映任何 排序。

0

指向成員的指針本身並不指向某些內存。他們只是標籤。你可以用它們做的唯一的事情就是將它們轉換爲運算符.*->*或者存儲在另一個指向成員變量的指針中的給定對象的指針值。

struct A 
{ 
    int a; 
    float b; 
}; 
A a; 
int A::* p2m = &A::a; 
int A::* p2m2 = p2m; 

int & realPointer = a.*p2m; 

注意,你只能用指針比較同類型的指針,所以你不能比較指針A::aint A::*)到A::bfloat A::*

0

您可以比較地址對象的成員:

A a; 
if (std::less<void*>()(&a.a, &a.b)) 
    std::cout << "a precedes b\n"; 
else 
    std::cout << "a follows b\n";