2012-01-05 53 views
1

我希望有人能指出我在正确的方向要弄清楚为什么我收到以下错误:获得一个未定义的引用错误

$~/display/triangleDisplayable.cc:4: undefined reference to `Displayable::Displayable()' 

我试图抽象类Displayable,并有一类triangleDisplayable实现其方法。两个头文件我是 “Displayable.h”:

class Displayable { 

    public: 
     Displayable(); 

     virtual int getSizeOfArrays() = 0; 
     void display(int size); 

    private: 
     virtual void init() = 0; 
     virtual int getSizeOfPointsArray() = 0; 
     virtual int getSizeOfNormalsArray() = 0; 

    }; 

和 “triangleDisplayable.h”

#include "Displayable.h" 

    class triangleDisplayable : public Displayable 
    { 

    public: 
     triangleDisplayable(); 
     int getSizeOfArrays(); 

    private: 
     void init(); 
     int getSizeOfPointsArray(); 
     int getSizeOfNormalsArray(); 

    }; 

然后我有 “Displayable.cc”

#include <iostream> 
    #include "Displayable.h" 

    Displayable::Displayable() { 
     std::cout << "testing Displayable constructor" << std::endl; 
    } 

    void Displayable:display(int size) { 
    } 

    int main() { 
     return 0; 
    } 

和“triangleDisplayable.cc”

#include <iostream> 
    #include "triangleDisplayable.h" 

    triangleDisplayable::triangleDisplayable() : Displayable() { 
    } 

    int triangleDisplayable::getSizeOfArrays() { 
     return 0; 
    } 

    void triangleDisplayable::init() { 
    } 

    int triangleDisplayable::getSizeOfPointsArray() { 
     return 0; 
    } 

    int triangleDisplayable::getSizeOfNormalsArray() { 
     return 0; 
    } 

    int main() { 
     return 0; 
    } 

我一直在尝试跟随各种教程来学习如何在C++中进行抽象,但我还没有真正能够找到任何有用的解决方案。我相信我所有的#include都是正确的,我读到的是一个常见问题。该错误消息似乎表明,问题是我已经试过没有: Displayable()编译行

triangleDisplayable::triangleDisplayable() : Displayable() { 
    } 

,但我得到了同样的错误。我的头文件中的语法可能有问题吗?

+1

你编译过Displayable.cc并链接到目标文件吗? – PlasmaHH 2012-01-05 10:43:10

+0

尝试定义构造函数..即代替Displayable();尝试Displayable(){};在Displayable.h文件中。这将在您所有的子类构造函数中调用 – Pramod 2012-01-05 10:48:04

+1

我没有将两个源文件链接在一起。谢谢您的帮助! – 2012-01-05 10:52:32

回答

6

不,错误在工具调用中。您需要将两个源文件链接在一起(例如g++ -o foo a.cc b.cc)。并删除main函数之一,因为你不能有两个不同的函数。

+0

谢谢你,那很棒!我无法相信我没有抓住这两个主要功能。 – 2012-01-05 10:51:46