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

标签 c++ inheritance compilation

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

我的设计有问题,我继承了这个 API,我无法更改它。

源.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): error C2065: 'VERSION' : undeclared identifier

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

最佳答案

您可以保持 API 的公共(public)部分不变,并添加一个返回版本的 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; }
};

关于c++ - 在 C++ 中为派生类定义问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23876413/

相关文章:

c++ - 如何添加 gstreamer 插件?

c++ - 右值引用的生命周期

c++ - Visual Studio 2010 中是否有编译器设置以确保可移植C++ 的编写?

.net - 从 C# 中的窗体继承

c++ - 有没有一种智能的方法可以在编译时知道要链接到的库的名称? (Linux/库本图)

class - 是否可以在没有整个项目的情况下重新编译单个 .java Java 文件?

c++ - 中缀方程求解器C++ While循环堆栈

Java 继承和构造函数参数

java - 转换为具体类并在 Java 中调用方法

c++ - 尝试编译 C 扩展模块时缺少 Python.h