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

C++ 编译错误undefined reference to ' ' 求破....

Mayuri 发布于 2013-04-03 17:46, 9383 次点击
刚学C++,对类不是很熟悉
有道题大概是说什么求矩形的周长和面积,用类去做
我写了三个文件,一个.h,两个.cpp
但是编译时老是说undefined reference to ' ' 看了很久依然没有办法....求各位大神指教!
这是头文件
程序代码:

//Rectangle.h

#ifndef RECTANGLE_H
#define RECTANGLE_H
class Rectangle
{
public:
    Rectangle(float = 1,float = 1);
   
    void perimeter(float ,float );
    void area(float ,float );
    float getLength();
    float getWidth();
    void setLengthWidth(float ,float );
   
private:
    float length;
    float width ;
};

#endif



这是第一个cpp
程序代码:

// Rectangle.cpp

#include <iostream>
#include <stdexcept>
#include "Rectangle.h"
using namespace std;

Rectangle::Rectangle(float a,float b)
{
    setLengthWidth(a,b);
}

void Rectangle::perimeter(float a,float b)
{
    cout << "The perimeter of the rectangle is " << 2(a+b) << endl;
}

void Rectangle::area(float a,float b)
{
    cout << "The area of the rectangle is " << a*b << endl;
}

float Rectangle::getLength()
{
    return length;
}

float Rectangle::getWidth()
{
    return width;
}

void Rectangle::setLengthWidth(float a,float b)
{
    if((a>=0.0&&a<=20.0)&&(b>=0.0&&b<=20.0))
    {
        length = a;
        width = b;   
    }
    else
    throw invalid_argument("The length or the width is out of range");
}



这是主函数的cpp
程序代码:

// RectangleClass.cpp

#include <iostream>
#include "Rectangle.h"
using namespace std;

int main()
{
    float a,b;
    cout << "Please enter the length and width for the rectangle : ";
    cin >> a >> b;
    Rectangle Calculate(a,b);
    Calculate.perimeter(Calculate.getLength(),Calculate.getWidth());
    Calculate.area(Calculate.getLength(),Calculate.getWidth());
        
    return 0;
}


在线等......
17 回复
#2
peach54602013-04-03 20:38
哪行报的?
另外?你知道这句话是什么意思吗?
#3
邓士林2013-04-03 20:38
我没有直接新建一个类给你调试,直接全部在一个cpp中进行的,2(a+b)你这个表达式有错误吧!其它的没有什么问问题,也没遇到你所描述的
#4
Mayuri2013-04-03 21:31
回复 2楼 peach5460

    Rectangle Calculate(a,b);
    Calculate.perimeter(Calculate.getLength(),Calculate.getWidth());
    Calculate.area(Calculate.getLength(),Calculate.getWidth());


这三行报错了......

--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------

检查文件依赖性...
正在编译 C:\Users\Alien\Desktop\HW4\9.11\RectangleClass.cpp...
正在连接...
[Error] RectangleClass.cpp:12: undefined reference to `Rectangle::Rectangle(float, float)'
[Error] RectangleClass.cpp:13: undefined reference to `Rectangle::getWidth()'
[Error] RectangleClass.cpp:13: undefined reference to `Rectangle::getLength()'
[Error] RectangleClass.cpp:13: undefined reference to `Rectangle::perimeter(float, float)'
[Error] RectangleClass.cpp:14: undefined reference to `Rectangle::getWidth()'
[Error] RectangleClass.cpp:14: undefined reference to `Rectangle::getLength()'
[Error] RectangleClass.cpp:14: undefined reference to `Rectangle::area(float, float)'
[Error] collect2: ld returned 1 exit status

构建中止 RectangleClass: 8 个错误, 0 个警告


就是这样,调试了很久都不行啊,求继续指教!
#5
Mayuri2013-04-03 21:32
回复 3楼 邓士林
这个呃,改正了是2*(a+b)
但依然报错,同样的错
#6
shmilyflf2013-04-03 23:13
#ifndef RECTANGLE_H
#define RECTANGLE_H
#endif
这个你是要干什么的? RECTANGLE_H这个是什么?
你知道#ifndef  #define  #endif这个是什么处吗?你这样可能使得这个类未被定义吧。

[ 本帖最后由 shmilyflf 于 2013-4-3 23:24 编辑 ]
#7
fanpengpeng2013-04-03 23:35
同样 mingw5
除了个2(a+b)
没有报错啊
#8
fanpengpeng2013-04-03 23:39
回复 6楼 shmilyflf
楼上不要吓人家啊 这个就是常规的头文件卫士 使用应该是没有问题的
#9
Mayuri2013-04-04 00:17
回复 7楼 fanpengpeng
那你改正之后可以运行吗
#10
Mayuri2013-04-04 00:18
回复 6楼 shmilyflf
就是为了防止重定义才用的......
#11
shmilyflf2013-04-04 00:39
回复 10楼 Mayuri
问题是你的那个#endif放的位置不对吧,你要是定义了那个RECTANGEL_H了,你的class就不定义了吗?不过我没把类放在#endif前面过,不知道会有什么结果,

建议你还是把#endif放在#define后面吧。
#12
Mayuri2013-04-04 07:10
回复 11楼 shmilyflf
即使我去掉了头文件卫士的那三行代码依然报错
#13
peach54602013-04-04 07:11
以下是引用shmilyflf在2013-4-3 23:13:01的发言:

#ifndef RECTANGLE_H
#define RECTANGLE_H
#endif
这个你是要干什么的? RECTANGLE_H这个是什么?
你知道#ifndef  #define  #endif这个是什么处吗?你这样可能使得这个类未被定义吧。

别瞎说误导人
#14
peach54602013-04-04 07:12
以下是引用shmilyflf在2013-4-4 00:39:12的发言:

问题是你的那个#endif放的位置不对吧,你要是定义了那个RECTANGEL_H了,你的class就不定义了吗?不过我没把类放在#endif前面过,不知道会有什么结果,

建议你还是把#endif放在#define后面吧。

其实按照你在六楼说的,我觉得你才应该去看一下这三个宏什么意思
#15
peach54602013-04-04 07:13
以下是引用Mayuri在2013-4-4 07:10:59的发言:

即使我去掉了头文件卫士的那三行代码依然报错

结合编译错误信息,和前面几个人的说法
你的H没有找到CPP...可能是路径问题吧?
#16
shmilyflf2013-04-04 09:52
回复 14楼 peach5460
呵呵,大神啊,但是我想请教个问题:
#include<stdio.h>
#define a 3
#ifndef a
#define b 4
int c=6;
#endif

int main()
{
    printf("%d\n",b);
    printf("%d\n",c);
    return 0;
}
上面的为什么会报错:
error C2065: 'b' : undeclared identifier
error C2065: 'c' : undeclared identifier
#17
iAkiak2013-04-04 11:12
程序代码:
--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------

检查文件依赖性...
正在编译 C:\Users\Alien\Desktop\HW4\9.11\RectangleClass.cpp...
正在连接...


注意到正在编译只出现了一次,就开始连接了。所以你的Rectangle.cpp没放到项目里么?
#18
peach54602013-04-05 11:42
以下是引用shmilyflf在2013-4-4 09:52:50的发言:

呵呵,大神啊,但是我想请教个问题:
#include
#define a 3
#ifndef a
#define b 4
int c=6;
#endif

int main()
{
    printf("%d\n",b);
    printf("%d\n",c);
    return 0;
}
上面的为什么会报错:
error C2065: 'b' : undeclared identifier
error C2065: 'c' : undeclared identifier

定义a=3
如果没有定义a则定义b=4,c=6
你说为什么报错呢?
1