2014-02-19 38 views
1
Class classname 
{ 
    int member1; 
    int member2; 
    ... 
    int membern; 
    public: 
     void setmember1(int); 
     void setmember2(int); 
     ... 
     void setmembern(int); 

     void getmember1(int); 
     void getmember2(int); 
     ... 
     void getmembern(int); 
} 

我知道我可以定義2n個函數來獲取和設置n所指定的就地構件值以上的聲明。C++類函數來獲取/設置的多個成員

但是,當n很大時,這似乎是不必要的乏味。有沒有好的方法來定義一個類函數,需要額外的參數設置/獲取任何類的成員?

編輯:拋開 語法錯誤,我的大ñ理由是維護類背後的科學框架。例如,說類是酶。所以我寧願將它的屬性保留在同一個地方,除非絕對必要,否則不用數字索引。

Set/get函數是公開的,因爲它們在不同的類中調用(即設置GUI)。

而且,不,不是所有的成員都是整數。爲了簡單起見,我複製了麪食。

+1

設置類成員的構造函數。 –

+2

有一個函數可以同時設置多個成員,這不是一個好主意。 – Victor

+1

您可以使用成員數組 – HEKTO

回答

3

或者:

  1. 寫腳本生成
  2. 把所有這些整數到一個數組的方法和使用一個GET /與指數

編輯

設置

除了你的get應該是

int getX() const; 

編輯

思想的另外兩個可能性

  1. 超載的[]操作
  2. 繼承std::vector
4

在實際的代碼,你不應該有很多數據類成員,當然不是單獨設置e和gettable。

可以達到你所要求使用的數組:

class classname 
{ 
public: 
    setMemberDangerously(size_t index, int value) { data[index] = value; } 
    setMember(size_t index, int value) 
    { 
    if (! index < size) throw std::out_of_range("Index out of bounds"); 
    data[index] = value; 
    } 
private: 
    int data[N]; 
}; 

但現在你的類看起來像一個集合,在這種情況下,你還不如用一個標準庫容器。

+0

這不是假設所有成員都是int嗎? –

+1

@AliAlamiri絕對。正如OP的例子。 – juanchopanza

+0

但是他可能在課堂上有其他類型,不僅僅是整數。我也想設置他可以使用構造函數的成員。 –

1

你可以發明任何工具,使你的設計糟糕的類「幾乎可以管理」。如果寫入getter/setter很困難,不要這樣做。你的班級必須是refactored

一般這裏的解決方案是切忌n

大值設計你的類來保存single responsibility principle。避免god-classes

0

您碰到了一個C++的老問題,這是非常有限的反射功能的語言。下面的討論是值得看的情況下,您是從語言帶着反思:

How can I add reflection to a C++ application?

至於實際的建議,這裏給出所有其他的答案完全合理。

0

我不喜歡setter/getters,雖然它們在像GUI這樣的應用程序中很常見。無論如何,我有一個通用的解決方案,確實需要一個庫,可能是這個問題的矯枉過正。假設你有以下類

class A 
{ 
    char member1; 
    int member2; 
    double membern; 

public: 
    void set_member1(char c) { member1 = c; } 
    void set_member2(int i) { member2 = i; } 
    void set_membern(double d) { membern = d; } 

    char get_member1() { return member1; } 
    int get_member2() { return member2; } 
    double get_membern() { return membern; } 
}; 

然後,您可以編寫

auto val = _('c', 42, 3.14); 
    auto set = _(&A::set_member1, &A::set_member2, &A::set_membern); 
    auto get = _(&A::get_member1, &A::get_member2, &A::get_membern); 

    A a; 
    (a ->* set)(val); 
    cout << (a ->* get)() << endl; 

它打印

(c, 42, 3.14) 

也就是說,您正在使用的元組的工作。語法_(...)代表一個元組; val是值的元組(可能具有不同類型)並且set/get元組指針。上述語法中的運算符->*允許在具有多個參數的單個對象上調用多個成員函數,每個函數一個參數。對get的調用結果又是一個值元組。

對於所有這些工作,您需要我正在開發的庫ivl。上面的語法只是一個小樣本;該庫更加靈活,允許爲標量定義函數或運算符,然後以任意組合方式在元組或數組上調用它們。所有C++操作符都被重載以允許這種「矢量化」。運算符->*也可以使用除指向成員的指針之外的函數對象,以便內聯調用。它還允許替代語法

a ->* set._(val); 
    cout << a ->* get._() << endl; 

這樣成員函數在應用到對象之前首先與參數綁定。成員函數可以擁有任意數量的參數(任何類型),但是在一次調用中所有參數都應該有相同數量的參數。