簡體   English   中英

復合成員 C++ 的 getter 和 setter

[英]getters and setters for composit members C++

我正在學習 C++,但我在為作為其他對象成員的對象的 getter 和 setter 時遇到了一些麻煩。

我有一個 DateOfBirth 類,其中包含 int month、int day、int year 及其適當的 getter 和 setter。 我想要一個 DateOfBirth 類的實例作為另一個類的私有成員。

容器類中的 getter/setter 的正確實現是什么?

取決於復制DateOfBirth的成本。 由於你的存儲只有幾個int s,我會像往常一樣寫一個 getter/setter:

const DateOfBirth &GetDate() const {return date;}
void SetDate(DateOfBirth new_date) const {date = new_date;}

但是請記住,沒有一個正確的實現,使用哪種 setter 取決於您首先需要它的原因。 如果您在讀/寫成員時不需要任何自定義邏輯(並且預計將來不需要它),您可以將成員設為公開。

如果類的復制成本很高,您可以讓 setter 返回一個非常量引用: DateOfBirth &SetDate() {return date;} ,但這嚴重限制了您可以添加到 setter 后者的邏輯,此時您可能會好讓會員公開。

您還可以為各個子成員實現設置器。

或者您可以讓“setter”接受一個函數/lambda,該函數/lambda 被賦予對該成員的非常量引用作為參數:

void SetDate(auto &&setter) {decltype(setter)(setter)(date);}
// Then:
x.SetDate([](DateOfBirth &date){date = ...;});

一種粗略的方式(與您當前給定的描述相匹配)如下所示:

class DateOfBirth 
{
  private:
    int month = 0, day = 0, year = 0;
  public:
    //getters 
    int getMonth() const 
    {
        return month;
    }
    int getDay() const 
    {
        return day ;
    }
    int getYear() const 
    {
        return year;
    }
    //setters
    void setMonth(int pmonth) 
    {
        month = pmonth;
    }
    void setDay(int pday)
    {
        day = pday ;
    }
    void setYear(int pyear)
    {
        year = pyear;
    }
};
class AnotherClas 
{
  DateOfBirth d; 
  public:
    //getter 
    DateOfBirth getDateOfBirth() const 
    {
        return d;
    }
    //setter 
    void setDateOfBirth(int pmonth, int pday, int pyear)
    {
        d.setMonth(pmonth); //set month 
        d.setDay(pday);     //set day 
        d.setYear(pyear);   //set year 
    }
};
int main()
{
    //create instance of another class 
    AnotherClas a; 
    a.setDateOfBirth(10, 2, 3);
    
    //lets confirm by printing 
    std::cout << a.getDateOfBirth().getMonth() << "-" << a.getDateOfBirth().getDay() << "-" << a.getDateOfBirth().getYear() <<std::endl; 
    return 0;
}

演示

上述程序的輸出是:

10-2-3

暫無
暫無

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

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