我正在编写代码来处理“Foo”类型的对象。 foo 是一种容器,为了提供对其元素的高效和抽象访问,它提供了 Element
类型的嵌套类。 Element
包装对象在容器中的位置。
现在,“Foo”可能有不同的实现,所以我正在编写一个抽象基类 FooInterface
来为它们提供一个通用接口(interface)。问题是每个实现可能需要定义自己的 Element
类型。例如,一个实现可能将其数据保存在一个 vector 中,这样它的 Element
包装一个 vector 迭代器,而另一个实现包含一个列表,并且它的 Element
包装一个列表迭代器。
我已经制定了一个使用 void 指针的解决方案。本质上,基类定义了一个包装了 void 指针的 Element
类。 FooInterface
的不同实现可以将 void 指针转换为它们用来表示元素的任何类型。暂时忽略内存泄漏:
class FooInterface
{
public:
class Element {
void* payload;
public:
Element(void* payload) : payload(payload) {}
void* getPayload() const { return payload; }
};
virtual void say_element(Element) = 0;
virtual Element getElement() = 0;
};
class FooOne : public FooInterface
{
public:
virtual void say_element(Element element)
{
std::cout << "FooOne says: " <<
* (int *) element.getPayload() << "." << std::endl;
}
virtual Element getElement()
{
return Element(new int(42));
}
};
class FooTwo : public FooInterface
{
public:
virtual void say_element(Element element)
{
std::cout << "FooTwo says: " <<
* (std::string*) element.getPayload() << "." << std::endl;
}
virtual Element getElement()
{
return Element(new std::string("This is a test"));
}
};
void say(FooInterface& foo)
{
FooInterface::Element el = foo.getElement();
foo.say_element(el);
}
int main()
{
FooOne foo_one;
FooTwo foo_two;
say(foo_one);
say(foo_two);
return 0;
}
虽然这可行,但似乎必须有更好的方法。我的理解是,如果可能的话,应该避免使用 void 指针。那么,这是实现这一目标的最佳方式吗?
编辑:
诚然,我在描述我在这篇文章中想要做的事情方面做得很差。尽管如此,答案还是有助于让我思考,我已经设计出我认为不错的解决方案 here .
最佳答案
您可以使 FooInterface
成为模板并传递任何 Element
应该存储的模板参数:
template <typename Payload>
class FooInterface
{
public:
class Element {
Payload payload;
public:
Element(Payload payload) : payload(payload) {}
Payload getPayload() const { return payload; }
};
virtual void say_element(Element) = 0;
virtual Element getElement() = 0;
};
然后您的子类必须将适当的模板参数传递给父类(super class):
class FooOne : public FooInterface<int>
{
public:
virtual void say_element(Element element)
{
std::cout << "FooOne says: " <<
element.getPayload() << "." << std::endl;
}
virtual Element getElement()
{
return Element(42);
}
};
关于C++从具有嵌套类的接口(interface)派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21611466/