注册 登录
编程论坛 C++教室

基类中函数调用派生类对象做参数,编译出错,是为什么?

hebinjie33 发布于 2013-06-20 09:33, 1700 次点击
如: Time 是基类 里面有个virtual void add(Time_12hours&t1)=0;函数,
Time_12hours是Time的一个派生类,编译时提示identifier 'Time_12hours',
我也实验过,肯定是函数参数的问题,不知道怎么解决?
17 回复
#2
rjsp2013-06-20 09:42
代码,完整的代码
#3
hebinjie332013-06-20 10:54
#include<iostream>
#include<string>
using namespace std;
class Time_12hours;
class Time_24hours;
class Time
{      
public:
    virtual bool operator > (Time_12hours&)=0;
    virtual bool operator > (Time_24hours&)=0;
    virtual bool operator ==(Time_12hours&)=0;
    virtual bool operator ==(Time_24hours&)=0;
    virtual bool operator <(Time_12hours&)=0;
    virtual bool operator <(Time_24hours&)=0;
    virtual void display()=0;
    int second;
    int minute;
    int hour;
};












class Time_12hours: public Time
{
public:
         Time_12hours():type("12-hours-time"),interval("AM"){}
         void set_date();
         void set_interval_1(){interval="AM";}            //用于主函数里的判断,给interval赋值
         void set_interval_2(){interval="PM";}            //用于主函数里的判断,给interval赋值
         virtual bool operator>(Time_12hours&);
         virtual bool operator>(Time_24hours&);
         virtual bool operator==(Time_12hours&);
         virtual bool operator==(Time_24hours&);
         virtual bool operator<(Time_12hours&);
         virtual bool operator<(Time_24hours&);
         virtual void display();
         string interval;            //标识为AM或者PM,interval=”AM”或interval=”PM”
private:   
         string type;                //标识为12进制时间,type=”12-hours-time”
};

void Time_12hours::set_date()
{
    cin>>hour>>minute>>second;
}

bool Time_12hours::operator>(Time_12hours& t1)
{

    if(interval==t1.interval)
    {
        if(hour>t1.hour){return true;}
        else if(hour<t1.hour){return false;}
        else if(minute>t1.minute){return true;}
        else if(minute<t1.minute){return false;}
        else if(second>t1.second){return true;}
        else if(second>=t1.second){return false;}
    }
    else if(interval=="PM"){return true;}
    else {return false;}
}

bool Time_12hours::operator>(Time_24hours& t2)
{
    int j;
    if(interval=="AM")j=0;
    else j=1;
    switch(j)
    {
        case 0:{hour=hour+12;}
        case 1:
        {
        if(hour>t2.hour){return true;}
        else if(hour<t2.hour){return false;}
        else if(minute>t2.minute){return true;}
        else if(minute<t2.minute){return false;}
        else if(second>t2.second){return true;}
        else if(second>=t2.second){return false;}
        }
    }
}

bool Time_12hours::operator==(Time_12hours& t1)
{
    if(interval==t1.interval)
    {
        if(hour==t1.hour)
        {
            if(minute==t1.minute)
            {
                if(second==t1.second)
                {
                    return true;
                }
                else return false;
            }
            else return false;
        }
        else return false;
    }
    else return false;
}

 bool Time_12hours::operator==(Time_24hours& t2)
 {
     switch(interval)
    {
        case "PM":{hour=hour+12;}
        case "AM":
        {
            if(hour==t1.hour)
            {
                if(minute==t1.minute)
                {
                    if(second==t1.second)
                    {
                        return true;
                    }
                    else return false;
                }
                else return false;
            }
            else return false;
        }
     }
 }

bool Time_12hours::operator<(Time_12hours& t1)
{
    if(interval==t1.interval)
    {
        if(hour<t1.hour){return true;}
        else if(hour>t1.hour){return false;}
        else if(minute<t1.minute){return true;}
        else if(minute>t1.minute){return false;}
        else if(second<t1.second){return true;}
        else if(second>=t1.second){return false;}
    }
    else if(interval=="AM"){return true;}
    else {return false;}
}

bool Time_12hours::operator<(Time_24hours& t2)
{
    switch(interval)
    {
        case "PM":{hour=hour+12;}
        case "AM":
        {
        if(hour<t1.hour){return true;}
        else if(hour>t1.hour){return false;}
        else if(minute<t1.minute){return true;}
        else if(minute>t1.minute){return false;}
        else if(second<t1.second){return true;}
        else if(second>=t1.second){return false;}
        }
    }
}

void Time_12hours::display()
{
    cout<<interval<<" ";
    if(hour<10)
        cout<<"0"<<hour<<":";
    else
        cout<<hour<<":";
    if(minute<10)
        cout<<"0"<<minute<<":";
    else
        cout<<minute<<":";
    if(second<10)
        cout<<"0"<<second<<endl;
    else
        cout<<second<<endl;
}









class Time_24hours: public Time
{
public:   
    Time_24hours():type("24-hours-time"){}
    void set_date();
    virtual bool operator>(Time_12hours&);
    virtual bool operator>(Time_24hours&);
    virtual bool operator==(Time_12hours&);
    virtual bool operator==(Time_24hours&);
    virtual bool operator<(Time_12hours&);
    virtual bool operator<(Time_24hours&);
    virtual void display();
private:   
    string type;            //标识为24进制时间,type=”24-hours-time”
};

void Time_24hours::set_date()
{   
    cin>>hour>>minute>>second;
}

bool Time_24hours::operator>(Time_12hours& t1)
{
    int j;
    if(t1.interval=="PM")j=1;
    else j=0;
    switch(j)
    {
        case 1:{hour=hour+12;}
        case 0:
        {
        if(hour>t1.hour){return true;}
        else if(hour<t1.hour){return false;}
        else if(minute>t1.minute){return true;}
        else if(minute<t1.minute){return false;}
        else if(second>t1.second){return true;}
        else if(second>=t1.second){return false;}
        }
    }
}
   
bool Time_24hours::operator>(Time_24hours& t2)
{
        if(hour>t2.hour){return true;}
        else if(hour<t2.hour){return false;}
        else if(minute>t2.minute){return true;}
        else if(minute<t2.minute){return false;}
        else if(second>t2.second){return true;}
        else if(second>=t2.second){return false;}
}


bool Time_24hours::operator==(Time_12hours& t1)
{
    int j;
    if(t1.interval=="PM")j=1;
    else j=0;
        
         switch(j)
    {
        case 1:{hour=hour+12;}
        case 0:
        {
            if(hour==t1.hour)
            {
                if(minute==t1.minute)
                {
                    if(second==t1.second)
                    {
                        return true;
                    }
                    else return false;
                }
                else return false;
            }
            else return false;
        }
     }
}
   

 bool Time_24hours::operator==(Time_24hours& t2)
 {
        if(hour==t2.hour)
        {
            if(minute==t2.minute)
            {
                if(second==t2.second)
                {
                    return true;
                }
                else return false;
            }
            else return false;
        }
        else return false;
 }


bool Time_24hours::operator<(Time_12hours& t1)
{
    int j;
    if(t1.interval=="PM")j=1;
    else j=0;
        switch(j)
    {
        case 1:{hour=hour+12;}
        case 0:
        {
        if(hour<t1.hour){return true;}
        else if(hour>t1.hour){return false;}
        else if(minute<t1.minute){return true;}
        else if(minute>t1.minute){return false;}
        else if(second<t1.second){return true;}
        else if(second>=t1.second){return false;}
        }
    }
   
}

bool Time_24hours::operator<(Time_24hours& t2)
{
    {
        if(hour<t2.hour){return true;}
        else if(hour>t2.hour){return false;}
        else if(minute<t2.minute){return true;}
        else if(minute>t2.minute){return false;}
        else if(second<t2.second){return true;}
        else if(second>=t2.second){return false;}
    }
}

void Time_24hours::display()
{
    if(hour<10)
        cout<<"0"<<hour<<":";
    else
        cout<<hour<<":";
    if(minute<10)
        cout<<"0"<<minute<<":";
    else
        cout<<minute<<":";
    if(second<10)
        cout<<"0"<<second<<endl;
    else
        cout<<second<<endl;
}











int main()
{
    Time *time1,*time2;
    Time_12hours t1,t2;
    Time_24hours t3,t4;
    int n;  //需要比较的时间组数
    int j;  //选择时间种类

    cin>>n;  //输入需要比较的时间组数

    for(;n>0;n--)
    {
        cin>>j;
        switch(j)
        {
        case 121:{t1.set_interval_1();t1.set_date();time1=&t1;}break;
        case 122:{t1.set_interval_2();t1.set_date();time1=&t1;}break;
        case 24:{t3.set_date();time1=&t3;}break;
        }

        cin>>j
        
        switch(j)
        {
        case 121:{t2.set_interval_1();t2.set_date();time2=&t1;}break;
        case 122:{t2.set_interval_2();t2.set_date();time2=&t1;}break;
        case 24:{t4.set_date();time1=&t4;}break;
        }
        if(*time1<*time2)
        {
        cout<<"time1";
        time1->display();
        cout<<"<";
        time2->display();
        }

        else if(*time1>*time2)
        {
        cout<<"time1";
        time1->display();
        cout<<">";
        time2->display();
        }
        else if(*time1==*time2)
        {
        cout<<"time1";
        time1->display();
        cout<<"==";
        time2->display();
        }
        else
        {
        cout<<"There is something wrong with the input."
            <<"Please check it!"<<endl;
        }
    }
    return 0;

}
#4
hebinjie332013-06-20 10:56
我知道问题出在哪:当在先建立的类中引用后建立的类对象当函数参数时,编译会出错。  这怎么解决?  比如我在Time_12hours 中>重载时引用Time_24hours类对象当参数  并定义,这时候就会出错。
#5
hebinjie332013-06-20 11:02
回复 2楼 rjsp
我贴好了
#6
rjsp2013-06-20 11:13
我让你贴完整的代码,是关于你所问的问题的完整,和问题不相干的代码,只能让人看得更累,算了。

把 class Time_24hours: public Time 的定义移到前面去,就是移到 class Time_12hours: public Time 的定义之后,实现代码之前

另外,bool operator > (Time_12hours&) 等等应该是 bool operator > ( const Time_12hours& ) const,这个不懂不像话
#7
hebinjie332013-06-20 11:30
回复 6楼 rjsp
感谢! 我刚学不久,不好意思,顺便再问一个问题:一般写c++的时候,有多个类,标准的格式是:所有类的声明都写在前面,所有类中的函数的定义都统一写在后面是吗?
#8
hebinjie332013-06-20 11:42
回复 6楼 rjsp
版主,那个问题解决了,麻烦你再看看我的main函数 我在用基类指针进行判断 > < ==时候又出错了,error C2679: binary '<' : no operator defined which takes a right-hand operand of type 'class Time' (or there is no acceptable conversion)  


谢谢。。。。。
#9
hebinjie332013-06-20 11:51
回复 6楼 rjsp
我试了一下不是switch 的问题,我把switch删去改成:int main()
{
    Time *time1,*time2;
    Time_12hours t1,t2;
    Time_24hours t3,t4;

    t1.set_date();
    time1=&t1;
    t3.set_date();
    time2=&t3;


        if((*time1)<(*time2))
        {
        cout<<"time1";
        time1->display();
        cout<<"<";
        time2->display();
        }

        else if(*time1>*time2)
        {
        cout<<"time1";
        time1->display();
        cout<<">";
        time2->display();
        }
        else if(*time1==*time2)
        {
        cout<<"time1";
        time1->display();
        cout<<"==";
        time2->display();
        }
        else
        {
        cout<<"There is something wrong with the input."
            <<"Please check it!"<<endl;
        }
   
    return 0;

}


问题依旧,报错说time1 和time2 不属于Time基类,可是我用了虚函数系统应该会识别啊。
#10
rjsp2013-06-20 12:02
回复 8楼 hebinjie33
完整的代码贴出来看看
#11
hebinjie332013-06-20 12:18
#include<iostream>
#include<string>
using namespace std;
class Time_12hours;
class Time_24hours;
class Time
{      
public:
    virtual bool operator > (Time_12hours&)=0;
    virtual bool operator > (Time_24hours&)=0;
    virtual bool operator ==(Time_12hours&)=0;
    virtual bool operator ==(Time_24hours&)=0;
    virtual bool operator <(Time_12hours&)=0;
    virtual bool operator <(Time_24hours&)=0;
    virtual void display()=0;
    int second;
    int minute;
    int hour;
};





class Time_12hours: public Time
{
public:
         Time_12hours():type("12-hours-time"),interval("AM"){}
         void set_date();
         void set_interval_1(){interval="AM";}            //用于主函数里的判断,给interval赋值
         void set_interval_2(){interval="PM";}            //用于主函数里的判断,给interval赋值
         virtual bool operator>(Time_12hours&);
         virtual bool operator>(Time_24hours&);
         virtual bool operator==(Time_12hours&);
         virtual bool operator==(Time_24hours&);
         virtual bool operator<(Time_12hours&);
         virtual bool operator<(Time_24hours&);
         virtual void display();
         string interval;            //标识为AM或者PM,interval=”AM”或interval=”PM”
private:   
         string type;                //标识为12进制时间,type=”12-hours-time”
};


class Time_24hours: public Time
{
public:   
    Time_24hours():type("24-hours-time"){}
    void set_date();
    virtual bool operator>(Time_12hours&);
    virtual bool operator>(Time_24hours&);
    virtual bool operator==(Time_12hours&);
    virtual bool operator==(Time_24hours&);
    virtual bool operator<(Time_12hours&);
    virtual bool operator<(Time_24hours&);
    virtual void display();
private:   
    string type;            //标识为24进制时间,type=”24-hours-time”
};






void Time_12hours::set_date()
{
    cin>>hour>>minute>>second;
}

bool Time_12hours::operator>(Time_12hours& t1)
{

    if(interval==t1.interval)
    {
        if(hour>t1.hour){return true;}
        else if(hour<t1.hour){return false;}
        else if(minute>t1.minute){return true;}
        else if(minute<t1.minute){return false;}
        else if(second>t1.second){return true;}
        else if(second>=t1.second){return false;}
    }
    else if(interval=="PM"){return true;}
    else {return false;}
}

bool Time_12hours::operator>(Time_24hours& t2)
{
    int j;
    if(interval=="AM")j=0;
    else j=1;
    switch(j)
    {
        case 0:        
        {
        if(hour+12>t2.hour){return true;}
        else if(hour+12<t2.hour){return false;}
        else if(minute>t2.minute){return true;}
        else if(minute<t2.minute){return false;}
        else if(second>t2.second){return true;}
        else if(second>=t2.second){return false;}
        }break;
        case 1:
        {
        if(hour>t2.hour){return true;}
        else if(hour<t2.hour){return false;}
        else if(minute>t2.minute){return true;}
        else if(minute<t2.minute){return false;}
        else if(second>t2.second){return true;}
        else if(second>=t2.second){return false;}
        }break;
    }
}

bool Time_12hours::operator==(Time_12hours& t1)
{
    if(interval==t1.interval)
    {
        if(hour==t1.hour)
        {
            if(minute==t1.minute)
            {
                if(second==t1.second)
                {
                    return true;
                }
                else return false;
            }
            else return false;
        }
        else return false;
    }
    else return false;
}

 bool Time_12hours::operator==(Time_24hours& t2)
 {
     int j;
         if(interval=="PM")j=1;
         else j=0;
     switch(j)
    {
        case 1:
        {
            if(hour+12==t2.hour)
            {
                if(minute==t2.minute)
                {
                    if(second==t2.second)
                    {
                        return true;
                    }
                    else return false;
                }
                else return false;
            }
            else return false;
        }
        case 0:
        {
            if(hour==t2.hour)
            {
                if(minute==t2.minute)
                {
                    if(second==t2.second)
                    {
                        return true;
                    }
                    else return false;
                }
                else return false;
            }
            else return false;
        }
     }
 }

bool Time_12hours::operator<(Time_12hours& t1)
{
    if(interval==t1.interval)
    {
        if(hour<t1.hour){return true;}
        else if(hour>t1.hour){return false;}
        else if(minute<t1.minute){return true;}
        else if(minute>t1.minute){return false;}
        else if(second<t1.second){return true;}
        else if(second>=t1.second){return false;}
    }
    else if(interval=="AM"){return true;}
    else {return false;}
}

bool Time_12hours::operator<(Time_24hours& t2)
{
    int j;
         if(interval=="PM")j=1;
         else j=0;
    switch(j)
    {
        case 1:{
        if(hour+12<t2.hour){return true;}
        else if(hour+12>t2.hour){return false;}
        else if(minute<t2.minute){return true;}
        else if(minute>t2.minute){return false;}
        else if(second<t2.second){return true;}
        else if(second>=t2.second){return false;}
        }
        case 0:
        {
        if(hour<t2.hour){return true;}
        else if(hour>t2.hour){return false;}
        else if(minute<t2.minute){return true;}
        else if(minute>t2.minute){return false;}
        else if(second<t2.second){return true;}
        else if(second>=t2.second){return false;}
        }
    }
}

void Time_12hours::display()
{
    cout<<interval<<" ";
    if(hour<10)
        cout<<"0"<<hour<<":";
    else
        cout<<hour<<":";
    if(minute<10)
        cout<<"0"<<minute<<":";
    else
        cout<<minute<<":";
    if(second<10)
        cout<<"0"<<second<<endl;
    else
        cout<<second<<endl;
}









void Time_24hours::set_date()
{   
    cin>>hour>>minute>>second;
}

bool Time_24hours::operator>(Time_12hours& t1)
{
    int j;
    if(t1.interval=="PM")j=1;
    else j=0;
    switch(j)
    {
        case 1:{
        if(hour>t1.hour+12){return true;}
        else if(hour<t1.hour+12){return false;}
        else if(minute>t1.minute){return true;}
        else if(minute<t1.minute){return false;}
        else if(second>t1.second){return true;}
        else if(second>=t1.second){return false;}
        }
        case 0:
        {
        if(hour>t1.hour){return true;}
        else if(hour<t1.hour){return false;}
        else if(minute>t1.minute){return true;}
        else if(minute<t1.minute){return false;}
        else if(second>t1.second){return true;}
        else if(second>=t1.second){return false;}
        }
    }
}
   
bool Time_24hours::operator>(Time_24hours& t2)
{
        if(hour>t2.hour){return true;}
        else if(hour<t2.hour){return false;}
        else if(minute>t2.minute){return true;}
        else if(minute<t2.minute){return false;}
        else if(second>t2.second){return true;}
        else if(second>=t2.second){return false;}
}


bool Time_24hours::operator==(Time_12hours& t1)
{
    int j;
    if(t1.interval=="PM")j=1;
    else j=0;
        
         switch(j)
    {
        case 1:
        {
            if(hour==t1.hour+12)
            {
                if(minute==t1.minute)
                {
                    if(second==t1.second)
                    {
                        return true;
                    }
                    else return false;
                }
                else return false;
            }
            else return false;
        }
     
        case 0:
        {
            if(hour==t1.hour)
            {
                if(minute==t1.minute)
                {
                    if(second==t1.second)
                    {
                        return true;
                    }
                    else return false;
                }
                else return false;
            }
            else return false;
        }
    }
}
   

 bool Time_24hours::operator==(Time_24hours& t2)
 {
        if(hour==t2.hour)
        {
            if(minute==t2.minute)
            {
                if(second==t2.second)
                {
                    return true;
                }
                else return false;
            }
            else return false;
        }
        else return false;
 }


bool Time_24hours::operator<(Time_12hours& t1)
{
    int j;
    if(t1.interval=="PM")j=1;
    else j=0;
        switch(j)
    {
        case 1:
        {
        if(hour<t1.hour+12){return true;}
        else if(hour>t1.hour+12){return false;}
        else if(minute<t1.minute){return true;}
        else if(minute>t1.minute){return false;}
        else if(second<t1.second){return true;}
        else if(second>=t1.second){return false;}
        }
        case 0:
        {
        if(hour<t1.hour){return true;}
        else if(hour>t1.hour){return false;}
        else if(minute<t1.minute){return true;}
        else if(minute>t1.minute){return false;}
        else if(second<t1.second){return true;}
        else if(second>=t1.second){return false;}
        }
    }
   
}

bool Time_24hours::operator<(Time_24hours& t2)
{
    {
        if(hour<t2.hour){return true;}
        else if(hour>t2.hour){return false;}
        else if(minute<t2.minute){return true;}
        else if(minute>t2.minute){return false;}
        else if(second<t2.second){return true;}
        else if(second>=t2.second){return false;}
    }
}

void Time_24hours::display()
{
    if(hour<10)
        cout<<"0"<<hour<<":";
    else
        cout<<hour<<":";
    if(minute<10)
        cout<<"0"<<minute<<":";
    else
        cout<<minute<<":";
    if(second<10)
        cout<<"0"<<second<<endl;
    else
        cout<<second<<endl;
}











int main()
{
    Time *time1,*time2;
    Time_12hours t1,t2;
    Time_24hours t3,t4;
    int n;  //需要比较的时间组数
    int j;  //选择时间种类

    cin>>n;  //输入需要比较的时间组数

    for(;n>0;n--)
    {
        cin>>j;
        switch(j)
        {
        case 121:{t1.set_interval_1();t1.set_date();time1=&t1;}break;
        case 122:{t1.set_interval_2();t1.set_date();time1=&t1;}break;
        case 24:{t3.set_date();time1=&t3;}break;
        }

        cin>>j;
        
        switch(j)
        {
        case 121:{t2.set_interval_1();t2.set_date();time2=&t2;}break;
        case 122:{t2.set_interval_2();t2.set_date();time2=&t2;}break;
        case 24:{t4.set_date();time1=&t4;}break;
        }
        if((*time1)<(*time2))
        {
        cout<<"time1";
        time1->display();
        cout<<"<";
        time2->display();
        }

        else if(*time1>*time2)
        {
        cout<<"time1";
        time1->display();
        cout<<">";
        time2->display();
        }
        else if(*time1==*time2)
        {
        cout<<"time1";
        time1->display();
        cout<<"==";
        time2->display();
        }
        else
        {
        cout<<"There is something wrong with the input."
            <<"Please check it!"<<endl;
        }
    }
    return 0;

}
  


找不到什么无关的。。。。。这就是完整代码了。。。
#12
hebinjie332013-06-20 12:20
问题会不会在用动态多态性的时候出了问题。系统没法识别多态性。
#13
hebinjie332013-06-20 12:26
我试过了,重载也没问题,问题是不是:3个类中的重载“>”因为所在类的不同 所以参数也不同,导致动态多态性调用失败。
#14
rjsp2013-06-20 13:07
回复 11楼 hebinjie33
比如 if((*time1)<(*time2))
两者都是 Time 类型,编译器不知道你想用
    virtual bool operator <(Time_12hours&)=0;
还是想用
    virtual bool operator <(Time_24hours&)=0;
#15
hebinjie332013-06-20 13:14
回复 14楼 rjsp
可是我已经用switch语句把time2赋值为time_12hours或者time_24hours类型了,编译器应该会知道这是重载了吧。

再者,我刚写了一下,明确把time2赋值为Time_12hours类型 time1也赋值为Time_12hours  也不行。

虽然time1是基类的指针,可是我定义了虚函数,应该会进行动态多态性的调用啊。
#16
hebinjie332013-06-20 13:21
我认为是> < == 这三个运算符在不同类中写的时候,类本身被默认为一个参数,导致不同类中的运算符参数类型不同,无法形成虚函数。

有什么解决办法吗
#17
rjsp2013-06-20 13:21
回复 15楼 hebinjie33
你搞不清 override 和 overload 呀
#18
rjsp2013-06-20 13:22
回复 16楼 hebinjie33
你说的东西虽然神奇,但肯定不是C++。
你还是多看看C++的基础书籍吧
1