C 带有嵌套类的抽象类.派生的类和嵌套类
c++ abstract class with nested class. derived class and nested class
我有编写自己的容器Linked_list
和Array_list
的任务。我有一个界面:
typedef int value_type;
class Container
{
public:
class Iterator
{
public:
Iterator();
Iterator(value_type* other);
Iterator(const Iterator& other);
Iterator& operator=(const Iterator& other);
...
};
Container();
Container(const Container& other);
~Container();
virtual value_type& front() const=0;
virtual value_type& back() const=0;
virtual Iterator begin() const=0; //
...
};
我确实派生的类linked_list和array_list:
class Linked_list:public Container
{
public:
long int cur_size;
List elem;
static Link end_;
class Iterator: public Container::Iterator
{
friend Linked_list;
Link *p;
};
Iterator begin() const; //overriding virtual function return type differs ...
...
}
我认为这都是错误的。嵌套类Linked_list::Iterator
应该是派生类吗?如果我不能更改接口,是否可以这样做?
考虑到您无法使用模板的设计约束,而不是一件事要更改:添加接口IteratorImpl
。因此,您可以从基本class Container
非虚拟中制作class Iterator
。它需要是非虚拟的,因为STL类迭代器应具有 value语义。有关更多详细信息,请参见PIMPL IDIOM!
这样:
typedef int value_type;
class Container
{
protected:
class IteratorImpl
{
public:
virtual void next() = 0;
virtual IteratorImpl* clone() const = 0;
virtual value_type get() const = 0;
virtual bool isEqual(const IteratorImpl& other) const = 0;
};
public:
class Iterator
{
public:
Iterator(IteratorImpl* impl) : impl(impl) {}
~Iterator() { delete impl; }
Iterator(const Iterator& other) : impl(other.impl->clone()) {}
Iterator& operator=(const Iterator& other) {
IteratorImpl* oldImpl = impl;
impl = other.impl->clone();
delete oldImpl;
}
bool operator == (const Iterator& other) const
{
return impl->isEqual(*other->impl);
}
Iterator& operator ++ ()
{
impl->next();
return *this;
}
value_type& operator*() const
{
return impl->get();
}
value_type* operator->() const
{
return &impl->get();
}
};
Container();
Container(const Container& other);
~Container();
virtual value_type& front() const=0;
virtual value_type& back() const=0;
virtual Iterator begin() const=0; //
...
};
然后在您的派生中仅实现iteratorImpl:
class Linked_list:public Container
{
protected:
class IteratorImpl: public Container::IteratorImpl
{
....
};
public:
Iterator begin() const { return new IteratorImpl(firstNode); }
Iterator end() const { return new IteratorImpl(nodeAfterLastNode); }
...
};
这些firstNode和nodeatterlastnode只是我的猜测 - 使用您需要实现iteratorImpl接口...
您应该定义一个const_value_type表示const value_type,并将其用于前后虚拟方法的返回值。另外,您可以在这些方法上删除const限定符,因为在const方法上具有非const参考返回类型是没有意义的。
没有课程的更多详细信息,其余的很难分辨。您还可以查看STL的早期实现:这是对这些主题进行一些见解的一个很好的方法。
相关文章:
- 嵌套在类中时无法设置成员数据
- 无法访问嵌套类.类的使用无效
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 如何在C++中初始化嵌套类中的2个memeber
- 受保护的嵌套结构不能用作派生外部类中的返回类型?
- 派生自嵌套在类模板中的类模板,所有这些都包含在类模板中
- CRTP:为什么获得嵌套类型和派生类的嵌套方法有区别
- 使用MPI/OpenMP的C 程序带有派生数据类型(嵌套类对象)容器
- 声明嵌套基模板类实例是派生类的好友
- 无法在派生类中定义嵌套类成员函数
- C++ 从嵌套类的接口派生
- C 带有嵌套类的抽象类.派生的类和嵌套类
- 从嵌套在模板中的类派生时编译问题
- 我应该在 c++ 中的派生类中继承嵌套类吗?
- dll内部定义的派生嵌套类的序列化
- c++派生出带有嵌套结构的纯抽象
- 派生类型可以与其基类的嵌套类型同名吗?
- C++ CRTP 并从 base 访问派生的嵌套类型定义
- 在c++中(在编译时)是否有办法强制派生类定义嵌套类型?
- 如何派生需要嵌套类的模板类型的模板类