Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不带模板的虚拟typedef的替代方案_C++_Templates_Inheritance_Iterator - Fatal编程技术网

C++ 不带模板的虚拟typedef的替代方案

C++ 不带模板的虚拟typedef的替代方案,c++,templates,inheritance,iterator,C++,Templates,Inheritance,Iterator,编辑的较短问题: 当使用指向抽象类的指针时,如何调用它所指向的对象的实际类型的方法 我有一个抽象的BaseTree类,带有一个公共 virtual BaseTree const& operator[](NodeIndex const& poss) const = 0; 其中,NodeIndex实际上是std::vector。我还有一个TreeBasicIterator类,其中包括 public: /// Access the tree to which m_tree p

编辑的较短问题: 当使用指向抽象类的指针时,如何调用它所指向的对象的实际类型的方法

我有一个抽象的
BaseTree
类,带有一个公共

virtual BaseTree const& operator[](NodeIndex const& poss) const = 0;
其中,
NodeIndex
实际上是
std::vector
。我还有一个
TreeBasicIterator
类,其中包括

public:
    /// Access the tree to which m_tree points
    BaseTree& operator*() const
    {
        //checking...
        return (*m_tree)[*this];
    }

private:
    /// the tree the current iterator refers to
    BaseTree* m_tree=nullptr;
问题(我认为这是我下面最初问题的关键):

如何使用与*m_树的实际类型对应的类的方法?现在,当取消对迭代器的引用时,我只能使用抽象类
BaseTree
的方法

我希望避免将
TreeBasicIterator
作为模板(参见下面的初始问题)

初始问题

< C++ >(相对较新的)用户,我想写< /P>
virtual typedef something my_virtual_type;
类内定义。不幸的是,这是不可能的

最流行的替代方案似乎是模板,例如,其中提供了一个很好的总结

然而,我不确定它涵盖了虚拟typedef的所有内容。我在下面提出一个问题,我希望使用虚拟typedef。我有一个(临时的?)工作解决方案,使用重载而不是模板

我想创建一个奇特的树结构,包括迭代器

1) 我定义了一个
NodeIndex
类型,它是我未来迭代器的祖先。(
NodeIndex
在我的例子中是
std::vector
,但这并不重要。)

2) 我定义了一个抽象的
BaseTree
类,在下面的迭代器中使用。该类特别包括返回要在树中移动的
NodeIndex
索引的虚拟方法(例如
NodeIndex begin()
),以及
运算符[](NodeIndex const&)

3) 我定义了一个
TreeBasicIterator
类,继承自
NodeIndex
,出于一致性目的,该类包括对
BaseTree
的常量引用,并实现了各种迭代器方法(利用
BaseTree
提供的虚拟方法)

(我实际上有两个类:
treebasicierator
,和
Const\u treebasicierator
,其中Const引用了
Const BaseTree
;我使用预处理器宏模拟基于Const的模板,但这是另一个问题。)

4) 我已经定义了一个
TreeNode
模板类(
T
是节点内容),继承自
BaseTree
。现在,它的
begin()
方法返回一个
NodeIndex
,它的
操作符[]
将一个
NodeIndex
作为参数,一切正常

5) 但是,我想在我的
TreeNode
类中包含我的
TreeBasicIterator
。我想包括一个

virtual typedef NodeIndex Iterator;
virtual typedef TreeBasicIterator Iterator;
在我的
BaseTree
类中,将虚拟
begin()
方法签名修改为
Iterator begin()
。 然后
TreeNode
将包含一个

virtual typedef NodeIndex Iterator;
virtual typedef TreeBasicIterator Iterator;
它的
begin()
方法签名将是
Iterator begin()
, 希望一切都会好起来:)

6) 我不希望在
TreeBasicIterator
上使用模板:它现在是一次性编译的

制作
BaseTree
模板将使
TreeBasicIterator
成为模板,从而失去了
BaseTree
中抽象的一部分好处

NodeIndex
作为
Iterator
类型实例化
BaseTree
是多余的:实际上没有人会从该特定实例继承

7) 预期:

我将使用结构固定或很少修改的树,但更频繁地修改节点内容,甚至更频繁地进行读取访问。为了优化访问,我打算进一步从
TreeNode
a
TreeVector
类派生,该类将包括
NodeIndex
(或
BasicTreeIterator
?)索引的排序穷举
std::vector
)。
TreeVector
中的
Iterator
虚拟类型将是std::Iterator

8) 当前(临时?)部分工作解决方案:

TreeNode
定义(通过一个常用的
typedef
)一个
Iterator
类型(my
treebasicaterator
类)。它不会覆盖
BaseTree
中的
迭代器类型,但它可以

BaseTree
有一个
NodeIndex begin()const
方法,该方法既不隐藏,又通过
迭代器begin()const
方法在
TreeNode
中重载。它不会被覆盖


类似地,我在
BaseTree
中有一个
NodeIndex next_index(NodeIndex)const
,它既不隐藏,又通过
迭代器next_index(迭代器)const
方法在
树节点中重载。。。无论如何,这里是我的工作解决方案:混合模板类和非模板类

TreeBasicIterator
仍然是问题中解释的非模板类

dynamic_cast
是在其
BaseTree
指针上调用树类特定方法的工具。但是,每次在代码中取消对迭代器的引用时都必须使用它是不合理的

我派生一个模板
TreeIterator
类:

template<class MyTree> class TreeIterator: public TreeBasicIterator

当所做的事情独立于所使用的实际树类时,将调用
TreeBasicIterator
的一次性编译方法。

C++不能以这种方式工作。故事结束。@Sam:我知道。我在寻找一个可能比我在我的观点中所提出的解决方案更有效的替代方案,因为我是新来的,也许解释否决票的评论会对我有所帮助