c++ 编译时报错 "undefined reference to ……"

编译情况

总共有五个文件,Graph.h ,Graph.cpp,diamond.h.diamond.cpp,new.cpp
编译成功的是我把diamond类的声明和定义(Graph的声明和定义也放在了一个文件里,但是没有影响)都放在diamond.cpp里。
new.cpp 就是包含了"Graph.h"和"diamond.",然后用diamond创建了一个对象,调用ShapePrint()函数。

Graph.h

 #ifndef _Graph_H_
#define _Graph_H_

class shape
{
    public:
        void ShapePrint();
        void ShapePrint(int x);
        void ShapePrint(int x,int y);
        int GetLength_x();
        int GetLength_y();
    protected:
        void SetLength_x(int length_x);
        void SetLength_y(int length_y);
    private:
        int length_x ;
        int length_y ;

};

#endif

diamond.h

 #include <iostream>
#include <iomanip>
#include "Graph.h"
#ifndef _diamond_
#define _diamond_
class diamond:public shape{
public:
    diamond();

    diamond(int x);

    int GetLength();
protected:
    void SetLength(int l);

private:
    int length;

};
#endif

diamond.cpp

 #include "diamond.h"
using namespace std;
void diamond::SetLength(int l)
{
    this->length = l;
}


int diamond::GetLength()
{
    return length;
}


diamond::diamond()
    {
        SetLength(7);
    }
diamond::diamond(int l)
    {
        SetLength(l);
    }
    void diamond::ShapePrint()
    {
        int length=GetLength();
        for(int i=1;i<=length;++i)
        {
            cout<<setw(length-i+1)<<"*";
            if(i!=1)
                cout<<setw(2*i-2)<<"*"<<endl;
            else
                cout<<endl;
        }
        for(int k=1;k<=length-1;k++)
        {
            cout<<setw(k+1)<<"*";
            if(k==length-1)
                cout<<endl;
            else
                cout<<setw(2*(length-k)-2)<<"*"<<endl;
        }
    }
    void diamond::ShapePrint(int x)
    {
        int length=GetLength();
        for(int i=1;i<=length;++i)
        {
            cout<<setw(x+(length-i+1))<<"*";
            if(i!=1)
                cout<<setw(2*i-2)<<"*"<<endl;
            else
                cout<<endl;
        }
        for(int k=1;k<=length-1;k++)
        {
            cout<<setw(x+k+1)<<"*";
            if(k==length-1)
                cout<<endl;
            else
                cout<<setw(2*(length-k)-2)<<"*"<<endl;
        }
    }
    void diamond::ShapePrint(int x,int y)
    {
        int length=GetLength();
        for(int i=1;i<=y;i++)
            cout<<endl;
        for(int i=1;i<=length;++i)
        {
            cout<<setw(x+(length-i+1))<<"*";
            if(i!=1)
                cout<<setw(2*i-2)<<"*"<<endl;
            else
                cout<<endl;
        }
        for(int k=1;k<=length-1;k++)
        {
            cout<<setw(x+k+1)<<"*";
            if(k==length-1)
                cout<<endl;
            else
                cout<<setw(2*(length-k)-2)<<"*"<<endl;
        }
    }

4个回答

g++ -o new Graph.cpp diamond.cpp new.cpp 应该没有问题
你需要了解g++的编译选项怎么用

mutojack
mutojack 谢谢老哥,的确可以了。我之前直接搜那个错误信息的时候,也看到这种说法,提到了编译器找不到定义的事情,请教一下,为什么这个编译命令可以,分开编译会报错呢?
一年多之前 回复

#include
#include
#include "Graph.h"
#ifndef diamond
#define diamond
class diamond:public shape{
public:
diamond();

diamond(int x);

int GetLength();

protected:
void SetLength(int l);

private:
int length;

};
#endif

mutojack
mutojack 没看懂……?
一年多之前 回复

是否diamond.h在多个文件夹下面有,diamond.cpp找错文件了,
你可以把diamond改个名称,再编译试试。

qq_28311221
温柔的小七 错误原因 头文件引用出问题
一年多之前 回复
mutojack
mutojack 的确在多个文件夹里有,但是改名了以后还是同样的报错
一年多之前 回复

把Graph.h的定义放到diamond.h 里面应该就能过

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!