我是C ++的新手。刚刚学习..说,我有两个类 - FrameCapture和ObjectTracker。 ObjectTracker使用FrameCapture作为实例变量。
以下是课程:
template<typename T>
class FrameCapture {
public:
FrameCapture(T *configOption) : configOption(configOption) {}
virtual bool nextFrame() const = 0;
private:
T *configOption;
};
和
template<typename T>
class ObjectTracker {
public:
ObjectTracker(FrameCapture<T> *capture) : capture(capture) {}
virtual void track() const = 0;
private:
FrameCapture<T> *capture;
};
FrameCapture
有一个模板化的配置选项。问题是我希望ObjectTracker
不知道FrameCapture
的模板详细信息。我想将FrameCapture
的不同实例提供给ObjectTracker
的实例,而ObjectTracker
的实例不会因FrameCapture
的实施而受到影响细节。我怎样才能做到这一点?
重批评论家接受了!
谢谢。
答案 0 :(得分:4)
由于你已经在使用继承,你可以这样做:
class FrameCaptureBase {
public:
virtual ~FrameCaptureBase() { }
virtual bool nextFrame() const = 0;
};
template<typename T>
class FrameCapture : public FrameCaptureBase {
public:
FrameCapture(T *configOption) : configOption(configOption) {}
private:
T *configOption;
};
class ObjectTracker {
public:
ObjectTracker(FrameCaptureBase *capture) : capture(capture) {}
virtual void track() const = 0;
private:
FrameCaptureBase *capture;
};
答案 1 :(得分:2)
您正在寻找的是类型擦除。
首先在未模板化的抽象基类中定义FrameCapture
的接口。
class FrameCapture
{
public:
virtual ~FrameCapture() noexcept = default;
virtual bool nextFrame() const = 0;
};
模板化版本然后从该界面派生。
template <typename T>
class FrameCaptureImpl : public FrameCapture
{
public:
FrameCaptureImpl(T *);
virtual bool nextFrame() const override = 0;
private:
T * config_; // Are you sure you want to use a raw pointer here?
};
ObjectTracker
仅使用非模板化界面。
class ObjectTracker
{
public:
ObjectTracker(FrameCapture *);
void track() const;
private:
FrameCapture * capture_; // Again, are you sure?
};
答案 2 :(得分:1)
从FrameCapture中删除构造函数和configOption。从FrameCapture派生ConfigurableFrameCapture类并将其全部添加回来。 ConfigurableFrameCapture是一个模板,FrameCapture不是。