2012-03-24 64 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; 
} 
相關問題