我正在處理一個我從未遇到過的非常奇怪的問題。下面是代碼:沒有在類中聲明的成員函數
//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