类转发声明错误
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 centimetern";
cin>>mtr>>cm;
}
void MEETER::display()
{
cout<<"n"<<mtr<<"m "<<cm<<"cmn";
}
void FEET::getdata()
{
cout<<"nEnter length in feet and inchn";
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:abhitype_lengthtype_lengthsource.cpp(27): error C2027: use of undefined type 'FEET'
1> g:abhitype_lengthtype_lengthsource.cpp(4) : see declaration of 'FEET'
1>g:abhitype_lengthtype_lengthsource.cpp(27): error C2228: left of '.get_feet' must have class/struct/union
1>g:abhitype_lengthtype_lengthsource.cpp(28): error C2027: use of undefined type 'FEET'
1> g:abhitype_lengthtype_lengthsource.cpp(4) : see declaration of 'FEET'
1>g:abhitype_lengthtype_lengthsource.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类的东西,因为它要求编译器知道类的定义。
发生错误的原因是编译器没有在构造函数的定义中使用的类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
中声明,并在定义两个类之后在类外定义。
这应该可以回答您的问题:我什么时候可以使用正向声明?
从那里:
不完整类型不能做什么:
使用这种类型的定义函数或方法
void f1(X x) {} // compiler error!
X f2() {} // compiler error!
该错误是由于您的MEETER(FEET f) { ... }
行
相关文章:
- 错误:未在此范围内声明'reverse'
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 错误:"imread"未在此范围内声明
- 在气泡排序程序中未声明错误功能
- 使用全局声明的向量时,C++双重释放错误/损坏
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- C++ [错误] 声明'char '隐藏参数。什么意思?
- 类中的静态函数给出了错误:声明中的两种或多个数据类型
- 错误:声明冲突 - 指针不能是 int
- 收到 CUDA 错误"声明与以前的"variable_name"不兼容
- 错误:声明不声明
- Visual Studio 2010 链接器错误C++声明我从头文件创建的类时
- Cython 错误:声明不声明任何内容
- 错误"声明非模板函数"C++
- 无效地使用不完整的类型/前向错误声明.可能误用抽象类?(c++)
- 错误:声明冲突.用c++编译c代码
- C++错误:声明中存在显式限定
- else语句(C++)上的错误w/声明
- 初始化const类成员,错误:声明没有声明任何内容