2013-05-14 58 views
1

我有興趣嘗試創建自定義類型,然後使用點語義訪問其成員。例如:我該如何構建這種類型的接口

Class A{ //simplified, omitting constructors and other methods 
    private: 
    float numbers[3]; 
    public: 
    float x(){ return numbers[0]; } 
    float y(){ return numbers[1]; } 
    float z(){ return numbers[2]; } 
    } 

所以我可以做這樣的事情:

A a; 
    //do stuff to populate `numbers` 

    float x=a.x; 

但我也想使元素numbers左值,所以我可以做這樣的事情:

A a; 
    a.y=5; //assigns 5 to numbers[1] 

我該怎麼做這個設置方法?

+1

class A {public:float x,y,z; };'? – BoBTFish 2013-05-14 09:53:29

+0

因爲「數字」的實際大小可能有所不同;我將使用模板來設置其大小 – johnbakers 2013-05-14 09:54:30

+1

那麼您將如何知道要使用的名稱? – BoBTFish 2013-05-14 09:55:11

回答

1

您可以返回一個參考,以便分配:

float & x(){ return numbers[0]; } 
    ^

// usage 
A a; 
a.x() = 42; 

你也應該有一個const過載,允許只讀到const對象訪問:

float x() const {return numbers[0];} 
      ^^^^^ 

// usage 
A const a = something(); 
float x = a.x(); 
+0

切換到這個答案,部分感謝您對他人的答案有用的意見,這是重要的注意事項 – johnbakers 2013-05-14 10:16:50

0

除非你實際上有名爲x,y和z的公共變量。

或者你可以返回一個引用,然後做a.y() = 5

1

第一。您製作了函數 x,y和z,但將它們分配爲浮動。這是行不通的。其次。更改這些函數返回referencies:

class A{ //simplified, omitting constructors and other methods 
    private: 
    float numbers[3]; 
    public: 
    float & x(){ return numbers[0]; } 
    float & y(){ return numbers[1]; } 
    float & z(){ return numbers[2]; } 
}; 
... 
A point; 
float x = point.x(); 
point.x() = 42.0f; 

還有另外一種方式:申報referencies作爲類的成員,並在C-TOR初始化它們:

class A{ //simplified, omitting constructors and other methods 
    private: 
    float numbers[3]; 
    public: 
    float & x; 
    float & y; 
    float & z; 
    A() : x(numbers[ 0 ]), y(numbers[ 1 ]), z(numbers[ 2 ]) {} 
}; 
... 
A point; 
float x = point.x; 
point.x = 42.0f; 

附:支付評論的關注,這給了@MikeSeymour

+2

引用成員不是一個好主意:它們阻止類可分配。 – 2013-05-14 10:05:18

+0

@MikeSeymour你是對的,我會優先考慮第一種方法,但我不知道OP要什麼,我給了兩種方法。謝謝你的評論 - 我會編輯一個答案在這一刻指向 – borisbn 2013-05-14 10:17:14

相關問題