c++ - 从 C++17 中的另一个构造函数调用具有不同参数类型的构造函数

标签 c++ constructor

我有一个名为 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_structParseStringContainingDate 在这里被声明为私有(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/

相关文章:

c++ - C++中如何创建派生类

c++ - 具有继承的构造函数定义

java - 覆盖java子类中的参数化构造函数

c++ - 如何在两个 C++20 范围上实现延迟计算的函数?

c++ - std::hex 无法处理负数?

c++ - 将类型分配给 typename 关键字

C++:如何通过其构造函数的参数初始化类内矩阵的维度?

c++ - 委托(delegate)构造函数

c++ - 如何使用 Attribute 作为 TinyXML2(C++) 的搜索关键字

c++ - fstream 保存文件和文件系统交叉链接的文件