没有在类中声明的成员函数

时间:2012-03-24 01:45:13

标签: c++ function compilation linker

我正处理一个我以前从未遇到的非常奇怪的问题。这是代码:

//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 for 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 :(得分: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;
}