2016-12-19 19 views
1

我有一個容器類,它包含具有類似getter函數的地圖中的各種對象。這本身就包含在使用該數據的類中。所以,我在這裏有一些連鎖店,這似乎並不理想。C++傳遞函數本身作爲參數

class Obj { 
    double getA() { return m_a; } 
    double getB() { return m_b; } 
    .... 

    double m_a, m_b, ...; 
} 

class Container { 
    map<long, Obj> m_objs; 

    getA(int i) { return m_objs[i].getA(); } 
    getB(int i) { return m_objs[i].getB(); } 
} 

class User { 
    Conainer m_cont; 
    getA(int i) { return m_cont.getA(i); } 

是否有更通用的方式來獲取對象值通過某種方式傳遞調用函數進入它。我承認整個長鏈的結構看起來並不理想,但在這種情況下,它似乎很自然,因爲我擁有某種對象樹並將信息向上傳遞到頂層節點,我不知道如何避免這種情況。但如果有更好的辦法任何建議,解決這個問題,我很高興聽到它

+4

處理它的更好的方法是容器有一個'get()',它返回'Obj&',讓調用者找出它想要在返回的對象上調用哪個getter。 –

+0

這似乎是一個不錯的開始。謝謝Sam – chrise

+0

我認爲你可以使用設計模式:工廠模式。這可以幫助你的類的用戶避免具有長鏈的構造函數。 – Yves

回答

2

你需要在這種情況下傳遞的對象是成員函數指針

class Obj { 
    // ... 

    double getA() { 
    return a; 
    } 

    double getB() { 
    return b; 
    } 

private: 
    double a; 
    double b; 
}; 

class Container { 
    // ... 
    get(int i, double (Obj::*what)()) { return (m_objs[i].*what)(); } 
}; 

class User { 
    Container m_cont; 
    // ... 
    get(int i, double (Obj::*what)()) { return m_cont.get(i, what); } 
}; 

// ... 
double myA = user.get(1, &Obj::getA); 

您還可以將它添加到Obj

double get(double (Obj::*what)()) { 
    return (this->*what)(); 
} 

使Container更符合User

class Container { 
    // ... 
    get(int i, double (Obj::*what)()) { return m_objs[i].get(what); } 
}; 
+0

非常感謝這個例子 – chrise