我正处理一个我以前从未遇到的非常奇怪的问题。这是代码:
//ISerialData.h
class ISerialData
{
public:
//snipped
virtual unsigned int getDataSize()=0;
//snipped
};
//CSerialData.h
class CSerialData : public ISerialData
{
private:
//snipped
unsigned int getDataSize();
//snipped
};
//CSerialData.cpp
unsigned int CSerialData::getDataSize()
{
return dataStream.str().length();
}
编译它会出错:
CSerialData.cpp:80: error: no ‘unsigned int CSerialData::getDataSize()’ member function declared in class ‘CSerialData’
在解决问题时,我从CSerialData.cpp中删除了实现,看看会发生什么。令我惊讶的是,它成功编译和链接。
为了测试,我在main.cpp中做了以下语句:
//main.cpp
ISerialData* sd = new CSerialData();
int w = sd->getDataSize();
std::cout<<"W: "<<w<<"\n";
其中输出如下:
W: -1543571782
如果程序有实现,它将为零,但我得到了垃圾。我希望它至少可以通过纯虚拟呼叫崩溃,更不用说链接了。
有什么可能导致它: 1.链接 2.运行没有定义的函数 3.没有捕获纯虚函数调用。 4.不以任何方式崩溃
必须有某些它正在调用,但我无法弄清楚如何进一步解决这个问题。
这是在Debian Squeeze 6.0.4下编译的: g ++ 4.4.5(Debian 4.4.5-8) ld版本:GNU ld(GNU Binutils for Debian)2.20.1-system.20100303
任何见解都是最受欢迎的,这个函数是我刚刚添加到课堂中的三个函数之一,它们都显示出相同的问题。
更新:测试用例有效,不知道如何重现问题
现在编译测试用例:
//Interface.h
#ifndef INTERFACEH
#define INTERFACEH
class IInterface
{
public:
virtual ~IInterface() {}
virtual unsigned int getDataSize()=0;
};
#endif
//CConcrete.h
#ifndef CONCRETEH
#define CONCRETEH
#include "IInterface.h"
class CConcrete : public IInterface
{
public:
CConcrete();
private:
unsigned int getDataSize();
unsigned int dataSize;
};
#endif
//CConcrete.cpp
#include "CConcrete.h"
CConcrete::CConcrete()
{
dataSize = 3;
}
unsigned int CConcrete::getDataSize()
{
return dataSize;
}
//main.cpp
#include "IInterface.h"
#include "CConcrete.h"
#include <iostream>
int main()
{
IInterface* interface = new CConcrete;
int w = interface->getDataSize();
std::cout<<"W: "<<w<<"\n";
return 0;
}
答案 0 :(得分:0)
我做了一些小改动(编译后)编译了你的代码。它在我的机器上运行良好。我在windows上编译(minGW,在qt 4.70)。以下是文件,包含更改。
//CConcrete.h
#ifndef CONCRETEH
#define CONCRETEH
#include "Interface.h"
class CConcrete : public IInterface
{
public:
CConcrete();
private:
unsigned int getDataSize();
unsigned int dataSize;
};
#endif
//Interface.h
#ifndef INTERFACEH
#define INTERFACEH
class IInterface
{
public:
IInterface();
virtual ~IInterface(){}
virtual unsigned int getDataSize()=0;
};
#endif
//CConcrete.cpp
#include "CConcrete.h"
CConcrete::CConcrete()
{
dataSize = 3;
}
unsigned int CConcrete::getDataSize()
{
return dataSize;
}
#include "Interface.h"
IInterface::IInterface()
{
}
#include "Interface.h"
#include "CConcrete.h"
#include <iostream>
#include <stdio.h>
int main(int argc, char *argv[])
{
IInterface* interface = new CConcrete;
int w = interface->getDataSize();
printf("%d", w);
return 0;
}