簡體   English   中英

C++ class:所有數據成員的一個getter/setter?

[英]C++ class: one getter/setter for all data members?

我嘗試通過一些 OOP 練習 C++,因此有這樣的 class:

class Obj
{
protected:
    cls1 class1;
    cls2 class2;
    ......
    clsn classn;
}

我想我真的需要protected這些成員。 那么問題就變成了其他函數如何調用 class 數據成員來檢索/修改其值。 一種常見的解決方案是通過 getter/setter 函數。 但是為每個成員編寫每個 getter 和 setter 會很麻煩。 那么,我可以用模板實現一個統一的 getter/setter 成員 function 嗎?

class Obj
{
    template<typename T> int get_stats(){
        ...
        // maybe using is_same_v<T,cls1> to get what class of data member I attempt to access
        // thus confirm the data member to access? 
    };
    template<typename T> void add_stats();
}

這可能嗎,或者有其他一些功能嗎?

實際上,不,不可能這樣做,為所有數據設置一個 getter 和一個 setter 將是一個糟糕的主意。 如果你這樣做了,為什么還要把它放在protected中,把它放在public中。 我也很確定您希望它們是private的而不是protected的。 但我沒有足夠的信息。

When doing OOP, you don't want that the user of your class have full control of your data, you only want to expose behavior of your class through function. 將您的數據private ,然后不要編寫設置器。 或者將它們公開,不要編寫 setter。

當然有時候,有一些二傳手很好,但我說的是通用的

嘗試將它們公開,或者您應該為每個變量創建一個 setter 和 getter,這是為了安全起見

您可以使用友元函數和類。 我建議你閱讀這篇文章

假設您的“模板獲取器/設置器”將做的不僅僅是返回引用/分配,那么我們可以使用boost::pfr庫做一些事情。

template<typename T>
T & get() { 
    auto & value = std::get<T>(boost::pfr::structure_tie(*this)); 
    /* do stuff */ 
    return value; 
}

template<typename T>
const T & get() const { 
    auto & value = std::get<T>(boost::pfr::structure_tie(*this)); 
    /* do stuff */ 
    return value; 
}

template<typename T>
void set(const T & value) {
    auto & member = std::get<T>(boost::pfr::structure_tie(*this));
    /* do stuff */ 
    member = value; 
}

如果您在/* do stuff */中沒有做任何事情,那么您不妨將這些成員設為public

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM