我有三个相互作用的类如下。 Class A
包含Class B
类型的私有成员。它还包含一个传递类型ClassC
的对象的方法。然后,此方法在ClassC
上调用方法,并向其传递ClassBInterface1
类型成员的特定接口(ClassB
):
ClassA
{
void Foo(ClassC ObjectC)
{
ObjectC.Bar((ClassBInterface1) ObjectB);
}
ClassB ObjectB;
}
我的问题是:ClassA
无需访问ClassB
中定义的Interface1
方法。因此,在我看来,如果ClassA
的成员属于ClassBInterface2
类型而非ClassB
,则会更优雅。是否可以这样做,同时仍在Interface1
下将B传递给C?
我能想到的唯一方法是在ClassBInterface2
中的Bar方法中将ClassB
转换为ClassBInterface1
并返回ClassA
。
这是最好的方法吗?或者我应该保持原样?
非常感谢您的帮助。
答案 0 :(得分:3)
如果您将ObjectB
定义为ClassBInterface2
,则无法在运行时将其转换为ClassBInterface1
,因为它的内部结构将不知道。
你的方式是最好的,但你可以做一点修改。调用ClassB
时,您无需从ClassBInterface1
到ObjectC.Bar
进行显式转换,因为编译器会为您执行此操作。
如果class B
定义如下:
ClassB : public ClassBInterface1, ClassBInterface2
{
/*Class methods and attributes*/
}
您可以在调用ObjectC上的Bar函数时执行以下操作(假设objectB
定义为ClassB
)
ObjectC.Bar(ObjectB);
答案 1 :(得分:0)
C ++有一个很棒的功能,叫做“前向声明”。基本上,对于代码中不需要知道类的详细信息的任何部分,您可以简单地传递引用。只有当你想调用成员方法(包括构造函数和析构函数)时,你才需要有完整的类定义。
#include "ClassC.h"
class ClassB;
class ClassA
{
public:
void foo(ClassC& objectC)
{
objectC.bar(_objectB);
}
protected:
ClassB& _objectB;
};
请注意,我们为ClassC添加了一个标头,因为我们需要调用他的一个方法。
请注意,我们转发声明ClassB并且仅持有引用,因为我们并不关心他是什么。
最后请注意,ClassA目前无法实例化,因为必须将对_objectB的引用设置为某种方式。例如,构造函数:
public ClassA(ClassB& objectB)
: _objectB(objectB)
{}
ClassA现在只保留在施工时给予他的任何参考。
根据您在问题中使用术语“界面”,我假设您可能有一个类层次结构。这个答案可以很容易地扩展到这样的层次结构。但重要的是,具体类型总是需要一个类定义,而简单的引用对象只需要一个前向声明。