Можно ли подавить часть инициализации конструктора по умолчанию? Мой текущий конструктор по умолчанию выглядит так:
Jd::Jd() {
time_t utcTime = time(NULL);
struct tm tmLocal;
localtime_s( &tmLocal, &utcTime );
jd_ = gregorian_to_jd(
tmLocal.tm_year + 1900,
tmLocal.tm_mon + 1,
tmLocal.tm_mday,
tmLocal.tm_hour,
tmLocal.tm_min,
tmLocal.tm_sec
);
}
И я использую две константы для инициализации моих объектов JD: WTIMEOFDAY и NOTIMEOFDAY.
Jd const NOTIMEOFDAY;
Jd const WTIMEOFDAY;
Я хочу, чтобы NOTIMEOFDAY был инициализирован как объект, построенный по умолчанию, но с использованием только метода year, month и day метода gregorian_to_jd() вместо всего. Это возможно?
EDIT: конструкторы в классе Jd
Jd();
Jd( jdn_t jdn ) : jd_( jdn ) { } //Sets the internal datamember to whatever is passed in.
//Jd( bool includeTime );
И ошибка, которую я получаю:
error C2668: 'calendar::Jd::Jd' : ambiguous call to overloaded function
could be 'calendar::Jd::Jd(bool)
or 'calendar::Jd::Jd(calendar::jdn_t)
Добавьте еще один конструктор, который принимает параметры:
Jd::Jd(int year, int month, int day, int hour, int min, int sec)
{
jd_ = gregorian_to_jd(year, month, day, hour, min, sec);
}
При создании ваших констант:
const Jd NOTIMEOFDAY(2013, 10, 12, 0, 0, 0); // new constructor called
const Jd WTIMEOFDAY; // default constructor called
Или вы можете использовать этот метод:
Jd::Jd(bool includeTime = true)
{
time_t utcTime = time(NULL);
struct tm tmLocal;
localtime_s( &tmLocal, &utcTime );
jd_ = gregorian_to_jd(
tmLocal.tm_year + 1900,
tmLocal.tm_mon + 1,
tmLocal.tm_mday,
includeTime ? tmLocal.tm_hour : 0,
includeTime ? tmLocal.tm_min : 0,
includeTime ? tmLocal.tm_sec : 0);
}
И затем инициализируйте свои константы:
const Jd NOTIMEOFDAY((bool)false);
const Jd WTIMEOFDAY;
Или...
// this will allow your double version to work
Jd::Jd(jdn_t jdn, bool includeTime = true)
{
// assuming what jdn_t looks like, so you'd have to make some adjustments
jd_ = gregorian_to_jd(
jdn.tm_year + 1900,
jdn.tm_mon + 1,
jdn.tm_mday,
includeTime ? jdn.tm_hour : 0,
includeTime ? jdn.tm_min : 0,
includeTime ? jdn.tm_sec : 0);
}
Или...
// this should fix the whole issue and is probably the better solution
class Jd
{
// other members
public:
explicit Jd(bool includeTime); // prevent implicit conversion
explicit Jd(jdn_t jdn); // also prevents implicit conversion
};
Jd::Jd(bool includeTime) // no default parameter
{
time_t utcTime = time(NULL);
struct tm tmLocal;
localtime_s( &tmLocal, &utcTime );
jd_ = gregorian_to_jd(
tmLocal.tm_year + 1900,
tmLocal.tm_mon + 1,
tmLocal.tm_mday,
includeTime ? tmLocal.tm_hour : 0,
includeTime ? tmLocal.tm_min : 0,
includeTime ? tmLocal.tm_sec : 0);
}
time(NULL); localtime_s(...);
звонкаtime(NULL); localtime_s(...);
когда-нибудь, прежде чем инициализировать константу и передать эти значения. Кроме того, вы можете добавить параметр по умолчанию в ваш конструктор по умолчанию ...