我有一个名为 Date 的类:
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),从而避免编写单独的函数?
更新:
一些澄清。我的类(class)应该如下所示:
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);
最佳答案
是的,您可以根据另一个构造函数来定义一个构造函数。不,我认为如果没有一些附加功能,您就无法做到这一点。
调用同一类的另一个构造函数的构造函数称为“delegating constructor ”,并使用与成员初始值设定项列表相同的语法,但使用类自己的名称而不是其基类和成员:
ClassName::ClassName(SomeParam1 p1, SomeParam2 p2)
: ClassName(arg_expr1, arg_expr2, arg_expr3)
{ /* any other logic after the target constructor finishes */ }
但是这种情况有点棘手,因为需要中间对象date_as_struct
。或者使用更新的问题,只需要在输入另一个构造函数之前进行一些解析。我将通过创建一个额外的私有(private)构造函数来解决这个问题,该构造函数采用 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
在这里被声明为私有(private),因为听起来没有其他东西会真正使用它们。
然后对于字符串构造函数,您只需
Date::Date(const std::string& date_as_string)
: Date(ParseStringContainingDate(date_as_string))
{}
Date(const Date_as_struct&)
构造函数可以非常轻松地委托(delegate)给 Date(int, int, int)
,反之亦然,以对实际成员初始化更自然的方式为准.
关于c++ - 从 C++17 中的另一个构造函数调用具有不同参数类型的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59616459/