在C ++中,我有一个模板函数,在给定条件下,它调用另一个类中的模板函数。问题是另一个类要求实现第一个类的完整定义,因为它创建了第二个类并存储它们并以类似的方式管理它们。
麻烦的是,它们自然而然地成为一个类,因此有一些紧密的互操作,除了我需要它们是两个类来处理线程的原因。所有线程的主人,每个线程一个孩子,系统。
有关如何实施此建议的任何建议?
编辑@评论: 我有一个看起来像这样的问题:
class Master {
public:
Child* CreateChild() {
return new Child();
}
template<typename T> T* GetSomething(int arg) {
return NULL;
}
};
class Child {
Master* master;
template<typename T> T* GetSomething(int arg) {
if (arg) return master->GetSomething<T>(arg);
else return NULL;
}
};
那些显然不是实际的实现,但足够类似于演示。如果这些是非模板函数,PIMPL只会有所帮助,但由于它们是,所以IMPL需要就在这里。
大师班管理所有孩子(为什么我选择师父和孩子而不是父母/孩子或主/奴?),他们的记忆,生命等等,以及一些其他系统范围的必需品。但Child类提供了大部分访问权限,在某些情况下必须回退到Master类。
此外,我还没有办法转向动态绑定。我的系统的其余部分已经彻底滥用动态绑定到绝对最大值,而我根本无法承受以这种方式再次使用它们的性能。有问题的Child函数被非常非常频繁地调用。
答案 0 :(得分:2)
对于您的示例,类具有模板函数的事实没有真正的区别;只需要对Child类进行前向引用,并在声明Child类之后放置CreateChild函数的定义:
class Child;
class Master {
public:
Child* CreateChild() ;
template<typename T> T* GetSomething(int arg) {
return NULL;
}
};
class Child {
public:
Master* master;
template<typename T> T* GetSomething(int arg) {
if (arg) return master->GetSomething<T>(arg);
else return NULL;
}
};
Child* Master::CreateChild() {
return new Child();
}
答案 1 :(得分:1)
最好的办法是尽可能地将它们分离,然后让“孩子”只使用指向“父”对象的指针(反之亦然)。这可能会变得棘手,具体取决于您要对模板执行的操作,因为它要求您将声明(头文件)与实现(C文件)正确分开。
Child.h:不要包含Parent.h,而是使用前向声明(例如:class Parent;
)。然后,您可以定义仅接受或返回父指针的函数(无引用或实例)。您无法调用任何Parent
成员函数或访问标题内的成员变量。
Parent.h:正常包含Child.h。对此文件中使用Parent或Child对象没有任何限制。
Parent.cpp和Child.cpp:正常包含Child.h和Parent.h。在这些文件中使用Parent或Child对象没有任何限制。
答案 2 :(得分:0)
简短的回答是:“转移到动态绑定。”
答案很长。那么,这取决于你想要达到的目的。但在大多数情况下,PIMPL惯用法通常是合适的,但为了达到这个目的,你必须牺牲一些性能。