在C ++中为派生类定义问题

时间:2014-05-26 19:14:49

标签: c++ inheritance compilation

我有2个来自相同API的类, 并希望能够为它们两者使用相同的API,两者之间的唯一区别是我需要放在API之外的定义,它将确定联合函数返回的结果中的某些内容。

我的设计存在问题,我继承了这个API,我无法改变它。

Source.cpp

#include <fstream>
#include <vector>
#include "Version100.h"
#include "Version200.h"

int main()
{
    Version100* ver100 = new Version100();
    int res  = ver100->PlusOne(2);
    Version200* ver200 = new Version200();
    res  = ver200->PlusOne(2);
}

VersionAPI.h - 这是我继承的API,我无法更改此实现

#pragma once
class VersionAPI
{
public:
    VersionAPI(void);
    ~VersionAPI(void);
    int PlusOne(int number);

};

VersionAPI.cpp - 我遇到的问题是我需要为每个类使用不同的VERSION定义

#include "VersionAPI.h"


VersionAPI::VersionAPI(void)
{
}


VersionAPI::~VersionAPI(void)
{
}


int VersionAPI::PlusOne(int number)
{
    return number + VERSION;
}

Version100.h

#pragma once
#define VERSION 100 

#include "VersionAPI.h"


class Version100 :
    public VersionAPI
{
public:
    Version100(void);
    ~Version100(void);
};

Version100.cpp

#include "Version100.h"


Version100::Version100(void)
{
}


Version100::~Version100(void)
{
}

Version200.h

#pragma once

#define VERSION 200
#include "versionapi.h"
class Version200 :
    public VersionAPI
{
public:
    Version200(void);
    ~Version200(void);
};

Version200.cpp

#include "Version200.h"


Version200::Version200(void)
{
}


Version200::~Version200(void)
{
}

我得到的错误是:

  

ersionapi.cpp(16):错误C2065:&#39; VERSION&#39; :未声明的标识符

我知道这是因为VERSION是在课外定义的。

2 个答案:

答案 0 :(得分:1)

VERSION定义为每个派生类的成员,并在VersionApi中创建PlusOne方法virtual

答案 1 :(得分:1)

您可以保持API的公共部分不变,并添加一个返回版本的private虚函数。版本本身可以是static成员,对于每个派生类型都不同,或者只是从version()虚函数返回的值:

class VersionAPI
{
public:
    VersionAPI();
    virtual ~VersionAPI();        // Don't forget the virtual derstuctor!!!
    int PlusOne(int number) const // mark "final" in C++11 
    { 
      return version() + number;
    }

private:
    virtual int version() const { return 123; }
};

然后在派生类型中实现version() const,返回相关的版本号。

class Version200 : public VersionAPI
{
public:
  Version200();
  ~Version200();
private:
  virtual int version() const { return 200; }
};