使用类成员正确声明一个函数?

时间:2014-02-23 22:22:17

标签: c++ class declaration

我正在尝试使用struct将C程序转换为带有class es的C ++。我试图从class B内调用class A的成员函数。这是一个解释我的错误的片段:

    class Time{
        public:
        Time();
        Time(int hour, int minute);
        int time_Equal(Time &a, Time &b) const;
        -----
        private:
        int hour;
        int minute;
    };

    Boolean Time::time_Equal(Time &a, Time &b) const
    {
        /* If hour of Time "a" equals hour of Time "b" */
        if(a.hour == b.hour){
            if(a.minute == b.minute)
                    return TRUE;
        }
    }

    class DaTime{
        public:
        DaTime();
        DaTime(Day day, Time start, Time end);
        Boolean dt_Equal(DaTime &a, DaTime &b) const;

        private:
        int duration;
        Time start;
        Time end;
    };

    Boolean DaTime::dt_Equal(DaTime &a, DaTime &b) const
    {
            if(time_Equal(a.start, b.start)){
                   if(time_Equal(b.end, a.end))
                          return TRUE;
            }

            else
                    return FALSE;        
    }

我得到的错误是time_Equal未在此范围内声明。我不明白这一点的原因是因为我已经包含了一个头文件,Time之前声明了DaTime。我没有看到我如何宣布这些功能的问题。

3 个答案:

答案 0 :(得分:3)

首先,请注意布尔类型只是bool

其次,time_Equal声明的返回类型为int,而定义为Boolean。很确定你想要两者都是bool。他们至少应该匹配。

第三,您的time_Equal函数不会修改其参数,因此您应该将它们const引用(const Time &aconst Time &b)。

第四,您的time_Equal函数是Time的非静态成员,但它不使用任何成员。也就是说,它的输出仅取决于它的参数,而不取决于this指向的对象。这是一种代码味道。这意味着您的函数可能应该是静态函数,或者您应该更改函数以使用this。所以你有两个选择:

  1. 将其保留为会员并将其更改为:

    bool time_Equal(const Time &other) const;
    

    然后在实现中,您应该将*thisother参数进行比较。在这种情况下,您可以将其称为a.start.time_Equal(b.start)

  2. 将它设为static成员或将其从类中取出并将其作为友元函数并使其保留两个参数:

    bool time_Equal(const Time &a, const Time &b) const;
    

    在这种情况下,您可以将其称为time_Equal(a.start, b.start)

  3. 第五,C ++有一个内置运算符来执行相等的测试(==),你可以为类重载。所以你实际上可以分别实现上面两个选项:

    bool operator==(const Time &other) const; // As a non-static member
    // or
    bool operator==(const Time &a, const Time &b) const; // As a static member or friend function
    

    然后你可以比较这样的时间:a.start == b.start。很好,是吗?

    有关详细信息,请参阅operator overloading FAQ

    第六,您的time_Equal实施时间不会返回false。您可以轻松地将主体重写为:

    return a.hour == b.hour && a.minute == b.minute;
    

答案 1 :(得分:1)

函数time_Equal被声明为类的非静态成员函数。所以它只能用于类的实例。 此外,它被声明为具有Time类型的参数。但是在函数dt_Equal中,您调用它传递类型int

的参数
        if(time_Equal(a.start, b.start)){
               if(time_Equal(b.end, a.end))
                      return TRUE;
        }

您应该将函数time_Equal声明为具有两个参数的非成员函数或具有一个参数的成员函数。

作为会员功能,它可能看起来像

bool Time::time_Equal( const Time &rhs ) const
{
    return (  hour == rhs.hour  && minute == rhs.minute );
}

作为一个非成员函数,它必须被声明为类的友元函数,因为数据成员的小时和分钟被定义为私有或者如果你有小时和分钟的getters,那么没有必要使它成为朋友。在任何情况下,它可能看起来像

bool Time::time_Equal( const Time &lhs, const Time &rhs )
{
    return (  lhs.hour == rhs.hour  && lhs.minute == rhs.minute );
    // or return (  lhs.get_hour() == rhs.get_hour()  && lhs.get_minute() == rhs.get_minute() );

}

答案 2 :(得分:0)

time_EqualTime类中的一个方法,但你称它为全局函数。 应在对象上调用实例级方法。