无法解析对类类型信息的引用

20

可能是重复问题:
g++ undefined reference to typeinfo
Undefined symbols “vtable for …” and “typeinfo for…”?

我的类无法使用。

class Accel {
public:
    virtual void initialize(void);
    virtual void measure(void);
    virtual void calibrate(void);
    virtual const int getFlightData(byte);
};
class Accel_ad : public Accel {
public:
    Accel_ad() : Accel(){}
    void initialize(void) {/*code code code...*/}
    void measure(void) {/*measure code*/}
    const int getFlightData(byte axis){/*getting data*/}
    void calibrate(void) {
        int findZero[FINDZERO];
        int dataAddress;
        uint8_t  data[2];
        for (byte calAxis = XAXIS; calAxis < ZAXIS; calAxis++) {
            if (calAxis == YAXIS) dataAddress = 0x32;
            if (calAxis == XAXIS) dataAddress = 0x34;
            if (calAxis == ZAXIS) dataAddress = 0x36;
            for (byte i=0; i<FINDZERO; i++) {
                readReverseWordI2C(dataAddress,data);
                findZero[i] = (data[1] << 8) | (data[0]);;
                Delay_ms(10);
            }
            accelZero[calAxis] = findMedian(findZero, FINDZERO);
        }

        // replace with estimated Z axis 0g value
        accelZero[ZAXIS] = (accelZero[XAXIS] + accelZero[PITCH]) / 2;
        // store accel value that represents 1g
        measure();
        accelOneG = -accelData[ZAXIS];
    }

主函数.cpp

Accel_ad accel;//all ok
accel.initialize();//all ok
accel.calibrate();//ERROR: undefined reference to `typeinfo for Accel'
accel.measure();//All okey

谁知道出了什么问题?

我得到的整个错误信息如下:

.\obj\main.o:(.rodata._ZTI8Accel_ad[typeinfo for Accel_ad]+0x8): undefined reference to `typeinfo for Accel' [cc] collect2: ld returned 1 exit status


2
请发布完整的编译错误。 - Nawaz
[cc] ..\obj\main.o:(.rodata._ZTI8Accel_ad[typeinfo for Accel_ad]+0x8): 对于“Accel”的typeinfo未定义引用 [cc] collect2: ld 返回了1个退出状态 - SevenDays
@wsevendays:请在问题中更新确切的错误信息。通常情况下,通过更新您的帖子来回应澄清请求,而不是通过评论进行回复。首先,一个问题应该可以在不阅读评论的情况下理解。其次,SO是一个问答网站,而不是论坛,评论并不适合用于讨论(也不是它们的目的)。 - outis
1个回答

64

你必须在基类中为虚函数提供定义,或者将其声明为纯虚函数:

class Accel {
public:
   virtual void initialize(void) = 0;        //either pure virtual
   virtual void measure(void) = 0; 
   virtual void calibrate(void) {};          //or implementation 
   virtual const int getFlightData(byte) {};
};

我发现如果我注释掉“measure();”这一行,我的代码就可以编译通过了。但是为什么我不能从类本身调用函数“measure();”呢? - SevenDays
在 calibrate 函数的结尾处,我调用了 measure 函数,但我的代码失败了。 - SevenDays
嗯...你的答案是正确的,但是你说的“virtual void initialize(void) = 0;”是什么意思? - SevenDays
但现在我的程序无法运行。 HardFault处理程序处理它。 - SevenDays
@wsevendays 这是一个抽象(或纯)虚方法,它还使类成为抽象类。你应该通过谷歌搜索来了解它,因为在评论框中无法充分解释其含义,而它在C++中是一个非常重要的概念。我猜它起作用了? - Luchian Grigore
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接