class 中的模板方法
Template method inside a class
我有一个名为 time
的 class,它有 day
、month
和 year
。
我在 return 我的方法中输入正确的值时遇到问题,根据我们输入的字符串 "s"
它应该 return 和 int
来自这 3 个字段之一的值。
因此,例如,如果我想在我的 日期 中获得天数,我应该调用函数 d["day"]
。
我的问题是,我的代码有问题吗?而且,我应该放什么而不是
int operator[] (string s)
{
if (s == "day" || s == "month" || s == "year")
{
return ? ? ? ;
}
}
从解释来看,如果我没有理解错的话,你需要以下内容。您需要根据字符串匹配 return 适当的成员(即 day
或 month
或 year
)。 (假设您的 Date
class 中有 mDay
、mMonth
和 mYear
作为 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 语句。
我有一个名为 time
的 class,它有 day
、month
和 year
。
我在 return 我的方法中输入正确的值时遇到问题,根据我们输入的字符串 "s"
它应该 return 和 int
来自这 3 个字段之一的值。
因此,例如,如果我想在我的 日期 中获得天数,我应该调用函数 d["day"]
。
我的问题是,我的代码有问题吗?而且,我应该放什么而不是
int operator[] (string s)
{
if (s == "day" || s == "month" || s == "year")
{
return ? ? ? ;
}
}
从解释来看,如果我没有理解错的话,你需要以下内容。您需要根据字符串匹配 return 适当的成员(即 day
或 month
或 year
)。 (假设您的 Date
class 中有 mDay
、mMonth
和 mYear
作为 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 语句。