【发布时间】:2021-01-12 17:48:02
【问题描述】:
我正在尝试创建一个抽象类模板 (InstanceTracker),如果类需要对其所有实例执行操作的功能,则可以从该模板继承。该类包含指向“T”的指针的静态向量,并且每次运行 InstanceTracker 构造函数时,我都会推回一个指向该向量的新指针。我通过返回“T*”的纯虚拟 getDerivedPtr() 方法执行此操作,从 InstanceTracker 派生的每个类都必须使用 return this; 实现。不过,您可能已经看到出了什么问题。您永远不能从基本构造函数调用纯虚函数——因为它还不存在。如何为我的 InstanceTracker 类找到解决此问题的方法?这是该类的代码:
#pragma once
#include <vector>
template <typename T>
class InstanceTracker
{
public:
InstanceTracker() noexcept
{
allInstances_.push_back(getDerivedPtr());
}
InstanceTracker(const InstanceTracker& source) noexcept
: InstanceTracker()
{
}
InstanceTracker(const InstanceTracker&& source) noexcept
: InstanceTracker()
{
}
virtual ~InstanceTracker() noexcept
{
auto it = std::find(allInstances_.begin(), allInstances_.end(), this);
int index = it - allInstances_.begin();
allInstances_.erase(allInstances_.begin() + index);
}
virtual T* getDerivedPtr() = 0;
protected:
static std::vector<T*> allInstances_;
};
如果你想尝试运行代码,看看它为什么现在不起作用,这里有一个继承自 InstanceTracker 的简单类:
class Derived1 : public InstanceTracker
{
public:
Derived1* getDerivedPtr() override
{
return this;
}
};
【问题讨论】:
-
将指针 (
this) 传递给InstanceTracker的 ctor? -
en.wikipedia.org/wiki/… 看起来与维基百科的示例非常相似。 stackoverflow.com/questions/4173254/…
-
我只想
static_castc'tor 中的this指针。 IIRC 只要以有限的方式使用指针,获取指向正在构建的对象的指针是合法的。仅仅存储它就是这样一种方式。 -
getDerivedPtr不需要是虚拟的。你可以在你的基地里static_cast<T*>(this)。
标签: c++ class-template