class 中的模板方法

Template method inside a class

我有一个名为 time 的 class,它有 daymonthyear

我在 return 我的方法中输入正确的值时遇到问题,根据我们输入的字符串 "s" 它应该 return 和 int 来自这 3 个字段之一的值。

因此,例如,如果我想在我的 日期 中获得天数,我应该调用函数 d["day"]。 我的问题是,我的代码有问题吗?而且,我应该放什么而不是

int operator[] (string s) 
{
    if (s == "day" || s == "month" || s == "year") 
    {
        return ? ? ? ;
    }
}

从解释来看,如果我没有理解错的话,你需要以下内容。您需要根据字符串匹配 return 适当的成员(即 daymonthyear)。 (假设您的 Date class 中有 mDaymMonthmYear 作为 int eger 成员)

int operator[] (std::string const& s) 
{
    if (s == "day")   return mDay;
    if (s == "month") return mMonth;
    if (s == "year")  return mYear;
    // default return
    return -1;
}

或者使用 switch statement

// provide a enum for day-month-year
enum class DateType{ day, month, year};

int operator[] (DateType type)
{
    switch (type)
    {
    case DateType::day:   return mDay;
    case DateType::month: return mMonth;
    case DateType::year:  return mYear;
    default:              return -1;
    }
}

一个简单的方法是将日期定义为一个包含三个元素的数组,而不是声明三个单独的数据成员。

在这种情况下,操作员可以按照下面的演示程序所示的方式查看。

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <stdexcept>

class MyDate
{
private:
    unsigned int date[3] = { 26, 12, 2019 };
public:
    unsigned int operator []( const std::string &s ) const
    {
        const char *date_names[] = { "day", "month", "year" };

        auto it = std::find( std::begin( date_names ), std::end( date_names ), s );         
        if (  it == std::end( date_names ) )
        {
            throw std::out_of_range( "Invalid index." );
        }
        else
        {
            return date[std::distance( std::begin( date_names ), it )];
        }
    }
};

int main() 
{
    MyDate date;

    std::cout << date["day"] << '.' << date["month"] << '.' << date["year"] << '\n';

    return 0;
}

程序输出为

26.12.2019

否则,您应该在运算符中使用 if-else 语句或 switch 语句。