Я имею дело с очень странной проблемой, с которой я никогда не сталкивался. Вот код:
//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 для 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;
}