我做了什么?需要在模板化类的方法中实例化派生类
What have I done? Need to instantiate derived class in method of a templated class
我有一个类,比如A
template <typename T> class A
{
} ;
和派生自 A<T>
的类(保留类型泛型)
template <typename T> class B : public A<T>
{
} ;
出现了我需要在 A<T>
中声明的方法中实例化B<T>
的情况。 呃哦。
template <typename T> class A
{
void go()
{
B<T> * newB = new B<T>() ; // oh boy, not working..
}
} ;
我应该怎么做以及如何解决这个问题?
您需要打破两个类之间的循环依赖关系。在这种情况下微不足道:只需在行外定义您的go()
函数:
template <typename T> class A
{
public:
void go();
} ;
template <typename T> class B : public A<T>
{
} ;
template <typename T>
void A<T>::go()
{
B<T> * newB = new B<T>() ;
}
无论如何,我更喜欢行外定义,即使在内联函数时也是如此,因为它避免了不必要的细节使界面混乱。我也更喜欢没有循环依赖关系(当然不是在基础和派生之间),但它并不总是可以避免的。
在从类模板继承之前,你可以A
向前声明类模板 - 只需确保遵循类B
的定义以及同一标头中类A
模板的定义:
template <typename T> class A;
template <typename T> class B : public A<T> {};
template <typename T> class A
{
void go()
{
B<T> * newB = new B<T>();
}
};
另一种方法是编写一个全局函数,每个template
类都声明 friend
void go( A<T> *a )
{
// Can now make a B<T>
B<T> *b = new B<T>() ;
// access b's and a's privates if this function
// is friend to A<T> and B<T>
}
相关文章:
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 为什么此派生对象无法访问基类的后递减方法?
- 是否可以为 QPixmap 派生类嵌入缩放方法?
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 使用基类中的派生方法运行线程,而无需使用模板
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 在派生类中使用基类的私有成员变量的最佳方法
- 如何在从抽象基派生的类中实现相同的方法?
- 调用从模板派生的类的静态方法,而不指定模板
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 从基类实例调用派生类方法而不进行强制转换
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- C ++基础私有方法在将自身转换为派生类后可以访问吗?
- C++ 使用派生类方法更改基类数据成员
- 如何使用派生类特定的方法:派生类中的派生成员
- 使用抽象类的指针访问派生类的方法;派生类似乎也是抽象的