我正在学习C++,对于作为其他对象成员的对象,我在getter和setter方面遇到了一些困难。
我有一个带有int、int、int年份的DateOfBirth类,以及它的适当的getter和setter。我希望有一个DateOfBirth类的实例作为另一个类的私有成员。
容器类中的getter/setter的正确实现是什么?
发布于 2022-06-08 23:02:36
这取决于复制DateOfBirth
的成本有多高。由于您只存储了几个int
,所以我会像往常一样写一个getter/setter:
const DateOfBirth &GetDate() const {return date;}
void SetDate(DateOfBirth new_date) const {date = new_date;}
但是要记住,没有一个正确的实现,使用什么样的setter取决于您为什么需要它。如果在读取/写入成员时不需要任何自定义逻辑(而且将来也不需要它),则可以使成员公开。
如果这个类的复制成本很高,您可以让一个setter返回一个non引用:DateOfBirth &SetDate() {return date;}
,但是这严重限制了您可以向setter添加什么逻辑,此时您最好让这个成员公开。
您还可以为单个子成员实现setter。
或者,您可以让"setter“接受一个函数/lambda,该函数/lambda被赋予对成员的非const引用作为参数:
void SetDate(auto &&setter) {decltype(setter)(setter)(date);}
// Then:
x.SetDate([](DateOfBirth &date){date = ...;});
发布于 2022-06-08 23:02:43
一种粗糙的方式(与您当前给定的描述相匹配)如下所示:
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
https://stackoverflow.com/questions/72555742
复制