我有一个叫做日期的课:
class Date {
public:
explicit Date(const int day = 1, const int month = 1, const int year = 0) {
this->Construct(day, month, year);
}
explicit Date(const string &date_as_string) {
int day, month, year;
// parsing the string date_as_string
this->Construct(day, month, year);
}
private:
void Construct(const int day, const int month, const int year) {
// constructing the Date object
}
};
有没有一种方法可以直接从Date(string&)调用Date(int,int,int),从而避免编写单独的函数?
UPD:
一些澄清。我的课应该像这样:
class Date {
public:
explicit Date(const int day = 1, const int month = 1, const int year = 0) {
// constructing the Date object
}
explicit Date(const string &date_as_string) {
int day, month, year;
// parsing the string date_as_string
// call Date(day, month, year) to construct the Date object
}
// any other functions
private:
// private fields
};
并应编译以下代码:
Date date("some_string_containing_date");
Date date(1, 1, 0);
是的,您可以定义另一个构造函数。不,我认为没有一些附加功能就无法做到。
调用同一类的另一个构造函数的构造函数称为“委托构造函数”,并且使用与成员初始值设定项列表相同的语法,但是使用类的自身名称而不是其基类和成员:
ClassName::ClassName(SomeParam1 p1, SomeParam2 p2)
: ClassName(arg_expr1, arg_expr2, arg_expr3)
{ /* any other logic after the target constructor finishes */ }
但是由于需要中间对象,所以这种情况有些棘手date_as_struct
。或使用更新后的问题,只需要在输入另一个构造函数之前进行一些解析即可。我将通过制作一个额外的私有构造函数来解决这一问题,该构造函数采用Date_as_struct
:
class Date {
public:
explicit Date(int day = 1, int month = 1, int year = 0);
explicit Date(const string &date_as_string);
/* ... */
private:
struct Date_as_struct {
int day;
int month;
int year;
};
explicit Date(const Date_as_struct&);
static Date_as_struct ParseStringContainingDate(const std::string&);
};
Date_as_struct
并ParseStringContainingDate
在此声明为私有,因为听起来没有其他东西会真正使用它们。
然后对于字符串构造函数,您只需
Date::Date(const std::string& date_as_string)
: Date(ParseStringContainingDate(date_as_string))
{}
该Date(const Date_as_struct&)
构造可以很容易授人以Date(int, int, int)
反之亦然,无论是实际的成员初始化更自然。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句