2012-03-24 67 views
0

我正在处理一个我从未遇到过的非常奇怪的问题。下面是代码:没有在类中声明的成员函数

//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; 
} 
+1

你可以把它归结为[最小测试用例](http://sscce.org)吗? – 2012-03-24 01:48:26

+0

另外:为什么你在界面上实现'private'功能?另外,其他编译器(例如VC++)会发生什么? – Cameron 2012-03-24 01:53:37

+0

是的,它也发生在最小的情况下。 – Brian 2012-03-24 02:01:27

回答

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; 
} 
相关问题