gpt4 book ai didi

c++ - 如何在 C++ 中使用模板编程从基类创建派生类?

转载 作者:太空狗 更新时间:2023-10-29 23:37:49 24 4
gpt4 key购买 nike

我需要从一个基类创建多个类(超过 50 个),其中唯一的区别在于派生类的名称。

比如我的基类定义为:

class BaseError : public std::exception
{
private:
int osErrorCode;
const std::string errorMsg;

public:
int ec;
BaseError () : std::exception(), errorMsg() {}

BaseError (int errorCode, int osErrCode, const std::string& msg)
: std::exception(), errorMsg(msg)
{
ec = errorCode;
osErrorCode = osErrCode;
}

BaseError (const BaseError& other)
: std::exception(other), errorMsg(other.errorMsg)
{
ec = other.errorCode;
osErrorCode = other.osErrorCode;
}

const std::string& errorMessage() const { return errorMsg; }

virtual ~BaseError() throw(){}

}

我必须从这个基类创建很多派生类,每个派生类都有自己的构造函数、复制构造函数和虚拟析构函数,目前我正在复制/粘贴代码,在必要时更改名称:

class FileError : public BaseError{
private:
const std::string error_msg;

public:
FileError () :BaseError(), error_msg() {}

FileError (int errorCode, int osErrorCode, const std::string& errorMessage)
:BaseError(errorCode, osErrorCode, errorMessage){}

virtual ~FileError() throw(){}
};

问题:有没有什么方法可以使用模板创建这些类,这样实现就不会重复?

最佳答案

我假设您想创建一个类层次结构,以便您可以在 catch 子句中使用动态分派(dispatch)(依靠编译器找出正确的类型)来实现自定义错误处理。为此,您可以保持 BaseError 类不变,然后添加一个模板类,然后为其提供多个实例化。考虑一下:

class BaseError : public std::exception
{
private:
int osErrorCode;
const std::string errorMsg;

public:
int ec;
BaseError () : std::exception(), errorMsg() {}

BaseError (int errorCode, int osErrCode, const std::string& msg)
: std::exception(), errorMsg(msg)
{
ec = errorCode;
osErrorCode = osErrCode;
}

// ...
};

template <int T>
class ConcreteError : public BaseError {
public:
ConcreteError () :BaseError(), error_msg() {}

ConcreteError (int errorCode, int osErrorCode, const std::string& errorMessage)
:BaseError(errorCode, osErrorCode, errorMessage){}
};

您现在可以设置一些类型定义:

typedef ConcreteError<0> FileError;
typedef ConcreteError<1> NetworkError;
typedef ConcreteError<2> DatabaseError;
// ...

您现在拥有一个包含三个不同错误类别的层次结构。

关于c++ - 如何在 C++ 中使用模板编程从基类创建派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4428509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com