我有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是在课外定义的。
答案 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; }
};