我正在处理一个我从未遇到过的非常奇怪的问题。下面是代码:没有在类中声明的成员函数
//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
如果程序有落实,这将是零,但我得到垃圾。至少我希望它能够以纯粹的虚拟呼叫的速度崩溃,更不用说链接正确。
什么可能导致它:在所有 2.运行 1.链接是没有定义 3.赶不上纯虚函数调用的函数。 4.不以任何方式崩溃
必须有东西它的呼唤,但我无法弄清楚如何这进一步解决。
这是Debian的下汇编挤压6.0.4具有: 克++ 4.4.5(Debian的4.4.5-8) LD版本:GNU LD(GNU Binutils的用于Debian)2.20.1-system.20100303
任何洞察力是最受赞赏的,这个功能是我刚添加到课堂上的三个功能之一,它们都显示相同的问题。
UPDATE:测试情况下工作,不知道如何重现问题
测试用例现在编译:
//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;
}
你可以把它归结为[最小测试用例](http://sscce.org)吗? – 2012-03-24 01:48:26
另外:为什么你在界面上实现'private'功能?另外,其他编译器(例如VC++)会发生什么? – Cameron 2012-03-24 01:53:37
是的,它也发生在最小的情况下。 – Brian 2012-03-24 02:01:27