0

I have three classes that interact as follows. Class A contains a private member of type Class B. It also contains a method to which an object of type ClassC is passed. This method then calls a method on ClassC, passing to it a particular interface (ClassBInterface1) of its member of type ClassB:

 ClassA
 {
     void Foo(ClassC ObjectC)
     {
         ObjectC.Bar((ClassBInterface1) ObjectB);
     }
     ClassB ObjectB;
 }

My question is: ClassA does not need to access the methods of ClassB defined in Interface1. Therefore, in my view, it would be more elegant if the member of ClassA was of type ClassBInterface2, rather than ClassB. Is it possible to do this, while still passing B to C under Interface1?

The only way I can think of is to typecast ClassBInterface2 to ClassB and back to ClassBInterface1 in the Bar method in ClassA.

Is this the best way to do it? Or should I just leave it as it is?

Thanks a lot for any help.

4

2 回答 2

3

如果您定义ObjectB为 a ClassBInterface2,则无法ClassBInterface1在运行时将其转换为,因为它的内部结构将是未知的。

你的方式是最好的,但你可以做一些修改。您不需要在调用时进行显式ClassB转换,因为编译器会为您完成。ClassBInterface1ObjectC.Bar

如果class B定义如下:

ClassB : public ClassBInterface1, ClassBInterface2
{

  /*Class methods and attributes*/

}

您可以在 ObjectC 上调用 Bar 函数时执行以下操作(假设objectB定义为ClassB

ObjectC.Bar(ObjectB);
于 2013-07-22T18:34:35.877 回答
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 现在只保留在构造上给他的任何参考。

根据您在问题中使用术语“接口”,我假设您可能有一个类层次结构。这个答案可以很容易地扩展到这样的层次结构。但这里重要的一点是,具体类型总是需要类定义,而简单引用对象只需要前向声明。

于 2013-07-22T18:37:29.983 回答