繁体   English   中英

类向前声明错误

[英]class forward declaration error

我正在做一个程序,将英尺转换为米,反之亦然。 我使用类和类型转换。 两个转换函数(使用构造函数)都使用其他类的成员。所以我使用了FEET类的前向声明

#include<iostream>
#include<conio.h>
using namespace std;
class FEET;
class MEETER
{
int mtr;
double cm;
public:
MEETER()
{
    mtr=0;
    cm=0;
}
void getdata();
void display();
int get_mtr()
{
    return(mtr);
}
double get_cm()
{
    return(cm);
}
MEETER(FEET f)
{
    int feet=f.get_feet();
    double inch=f.get_inch();
    inch+=feet*12;
    cm=inch*2.54;
    mtr=int(cm)/100;
    cm=cm-(mtr*100);
}
~MEETER()
{
}
};
class FEET
{
int ft;
double in;
public:
FEET()
{
    ft=0;
    in=0;
}
void getdata();
void display();
int get_feet()
{
    return(ft);
}
double get_inch()
{
    return(in);
}
FEET(MEETER f)
{
    int mtr=f.get_mtr();
    double cm=f.get_cm();
    cm+=mtr*100;
    in=cm/2.54;
    ft=int(in)/12;
    cm=cm-(ft*12);
}
~FEET()
{
}
};
void MEETER::getdata()
{
cout<<"\nEnter length in meter and centimeter\n";
cin>>mtr>>cm;
}
void MEETER::display()
{
 cout<<"\n"<<mtr<<"m "<<cm<<"cm\n";
}
void FEET::getdata()
{
 cout<<"\nEnter length in feet and inch\n";
 cin>>ft>>in;
}
void FEET::display()
{
 cout<<"\n"<<ft<<"\""<<in<<"\n";
}
int main()
{
FEET f1,f2;
MEETER m1,m2;
f1.getdata();
m1=f1;
m2.getdata();
f2=m2;
f1.display();
m1.display();
f2.display();
m2.display();
getch();
return(0);
}

但是程序显示错误如下:

1>------ Build started: Project: Type_Length, Configuration: Debug Win32 ------
1>  source.cpp
1>g:\abhi\type_length\type_length\source.cpp(27): error C2027: use of undefined type 'FEET'
1>          g:\abhi\type_length\type_length\source.cpp(4) : see declaration of 'FEET'
1>g:\abhi\type_length\type_length\source.cpp(27): error C2228: left of '.get_feet' must have class/struct/union
1>g:\abhi\type_length\type_length\source.cpp(28): error C2027: use of undefined type 'FEET'
1>          g:\abhi\type_length\type_length\source.cpp(4) : see declaration of 'FEET'
1>g:\abhi\type_length\type_length\source.cpp(28): error C2228: left of '.get_inch' must have class/struct/union
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

帮我解决

因此,您已经向前声明了类FEET,这意味着编译器知道FEET是某些用户定义的数据类型。

但是后来您在MEETER课堂上正在做类似的事情

MEETER(FEET f)

也就是说,您正在迫使编译器预测您尚未定义的FEET类的大小。 这就是为什么它抱怨。

为了解决这个问题,您可以在MEETER类中使用指向FEET的指针,因为它不会强制编译器知道类FEET的大小。

MEETER(FEET* f)

另外,禁止在此函数中使用任何特定于FEET类的内容,该内容要求编译器知道您的类的定义。

这应该回答您的问题: 什么时候可以使用前向声明?

从那里:

不完整类型不能做的事情:

  • 使用此类型定义函数或方法

    void f1(X x) {} // compiler error!
    X f2() {} // compiler error!

该错误是由于您的MEETER(FEET f) { ... }行引起的

发生错误是因为编译器没有在构造函数的定义中使用的类FEET的定义

MEETER(FEET f)
{
    int feet=f.get_feet();
    double inch=f.get_inch();
    inch+=feet*12;
    cm=inch*2.54;
    mtr=int(cm)/100;
    cm=cm-(mtr*100);
}

您应该在MEETER的类定义中声明构造函数,并在定义类FEET之后在类外进行定义

例如

class MEETER
{
    MEETER(FEET f);
    // other members
};

class (FEET
{
    // its members
};

MEETER::MEETER(FEET f)
{
    int feet=f.get_feet();
    double inch=f.get_inch();
    inch+=feet*12;
    cm=inch*2.54;
    mtr=int(cm)/100;
    cm=cm-(mtr*100);
}

应该对类FEET的构造函数执行相同的操作

FEET(MEETER f)
{
    int mtr=f.get_mtr();
    double cm=f.get_cm();
    cm+=mtr*100;
    in=cm/2.54;
    ft=int(in)/12;
    cm=cm-(ft*12);
}

也就是说,仅应在FEET类中声明该类,并在定义这两个类之后在该类外部进行定义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM