应该何时实施特定的构造函数?

时间:2014-08-01 07:16:40

标签: c++ class constructor

如果我的班级中有不同的属性,例如以下代码:

class Position
{
    double latitude;
    double longitude;
    double altitude;

    PosixTime time;
};

所以我们说这是我想要构建的类,其中time(在当前开发时)总是当前时间。我目前不会使用任何其他时间,它始终是创作时间。我还应该使用时间参数实现构造函数吗?也许以后或其他开发人员使用它?总结了两个选项:

  1. 只编写2个构造函数:

    Position()
    : latitude(0)
    , longitude(0)
    , alitutde(0)
    , time(PosixCurrentTime()) {}
    
    Position(double lat, double lon, double alt)
    : latitude(lat)
    , longitude(lon)
    , alitutde(alt)
    , time(PosixCurrentTime()) {}
    
  2. 编写3个构造函数(从顶部和后面):

    Position(double lat, double lon, double alt, PosixTime t)
    : latitude(lat)
    , longitude(lon)
    , alitutde(alt)
    , time(t) {}
    

3 个答案:

答案 0 :(得分:2)

您只需要一个构造函数,其参数的默认值为。

Position(double lat = 0, double lon = 0, double alt = 0, PosixTime t = get_current_time())
  : latitude(lat), longitude(lon), alitutde(alt), time(t) 
{
}

请注意,在此示例中,get_current_time()是函数的占位符,它返回当前时间。

答案 1 :(得分:2)

是否提供允许将time设置为某个任意值的构造函数是您应根据类的语义做出的设计决策。考虑未来的用例,以及该功能是否有意义。如果你决定这样做,你可以将构造函数2和3合并为一个。

Position(double lat, double lon, double alt, PosixTime t = PosixCurrentTime())
: latitude(lat)
, longitude(lon)
, alitutde(alt)
, time(t) {}

如果您的编译器支持C ++ 11,请将该类定义为

class Position
{
    double latitude = 0;
    double longitude = 0;
    double altitude = 0;

    PosixTime time = PosixCurrentTime();

public:
    Position() = default;
    Position(double lat, double lon, double alt, PosixTime t = PosixCurrentTime())
    : latitude(lat)
    , longitude(lon)
    , alitutde(alt)
    , time(t) {}
};

答案 2 :(得分:0)

如果时间是(在当前开发时)总是当前时间,那么您只能声明一个get方法:

class Position {
public:
  static Posixtime getCurrentTime() const;
private:
    double latitude;
    double longitude;
    double altitude;
};

这是一个选项,否则您应该只有一个具有所有默认值的构造函数:

class Position {
public:
  Position(const double& = 0, const double& = 0, const double& = 0, const PosixTime& = getCurrentTime())
};

Position::Position(const double& lat, const double& lon, const double& alt, const PosixTime& t) : 
    latitude(lat),
    longitude(lon),
    altitude(alt),
    time(t) {
}