в классе не объявлено ни одной функции-члена - PullRequest
0 голосов
/ 24 марта 2012

Я имею дело с очень странной проблемой, с которой я никогда не сталкивался. Вот код:

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

1 Ответ

0 голосов
/ 24 марта 2012

Я скомпилировал ваш код, сделав несколько небольших изменений (чтобы он компилировался).На моей машине работает нормально.Я компилирую на 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;
}
...