gpt4 book ai didi

c++ - 如何构造一个可以代入子类然后泛化调用的模板类类型?

转载 作者:行者123 更新时间:2023-11-28 01:21:38 26 4
gpt4 key购买 nike

我有 10 种硬币类型:BTC、ETH、Shift 等。为此,我有一个父类(super class)“Coin”和每个这些硬币的子类。然后我有一个指向“硬币”类型的指针,这样我就可以调用每个子类,无论它们是什么子类型。

问题是,我只知道如何用 Java 而不是 C++。我很难搜索正确的术语,因为除了“泛型”之外,我真的不知道要搜索什么。我想要的是这样的:

// Superclass
class Coin {
public:
virtual void handleCoin();
};


// Subclass
class BTC: public Coin {
void handleCoin();
}

BTC::BTC() = default;
BTC::~BTC() = default;

BTC::handleCoin() {
std::cout << "handling BTC" << std::endl;
}


// Subclass
class ETH: public Coin {
void handleCoin();
}

ETH::ETH() = default;
ETH::~ETH() = default;

ETH::handleCoin() {
std::cout << "handling ETH" << std::endl;
}


// Execute
int main() {
Coin* coin;
coin = BTC();
coin.handleCoin();
coin = ETH();
coin.handleCoin();
return 0;
}

我要打印:

handling BTC
handling ETH

我知道我需要使用模板,但我找不到这个具体案例的具体示例。

另外,我的构造函数不带参数,所以我猜我的模板声明应该是这样的

template<>

然而我看到的所有例子都适用

template<typename T>

然后像调用一样使用类型 T 作为函数参数

max<float, float>
max<double, double>

但这不是我要找的。有没有办法将上面的示例转换为有效的 C++ 代码?

最佳答案

从发布的代码中我看不出需要模板,虚拟方法无需模板即可工作。要修复 main 中的代码,您需要使用指针/引用并且还需要一个虚拟析构函数。

class Coin {
public:
virtual void handleCoin();
virtual ~Coin()=default;
};
class BTC: public Coin {
public:
BTC::BTC() = default;
//Destructor of a derived class is automatically virtual if the base class's one is.
void handleCoin();
}

// Subclass
class ETH: public Coin {
void handleCoin();
ETH::ETH() = default;
//Still virtual even if you specify otherwise
ETH::~ETH() = default;
}
int main() {
Coin* coin;
coin = new BTC();//Returns BTC* <--pointer

coin->handleCoin();
delete coin;//Calls Coin::~Coin() -> thus the need for virtual so BTC::~BTC is called instead.
coin = new ETH();
coin->handleCoin();
delete coin;//Same, calls ETH::~ETH()
return 0;
}

手动内存管理容易出错,从 C++11 开始有一个更好的方法应该被强烈推荐:

int main() {
std::unique_ptr<Coin> coin;//Hides the pointer, but still has pointer-like semantics
coin = std::make_unique<BTC>();
coin->handleCoin();
//Automatically frees old memory
coin = std::make_unique<BTC>();
coin->handleCoin();
//Calls unique ptr's dtor because coin is local variable, which again frees the memory correctly.
return 0;
}

关于c++ - 如何构造一个可以代入子类然后泛化调用的模板类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55956647/

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