Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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/4/oop/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++ 在给定场景中访问类的公共方法-C++;_C++_Oop - Fatal编程技术网

C++ 在给定场景中访问类的公共方法-C++;

C++ 在给定场景中访问类的公共方法-C++;,c++,oop,C++,Oop,考虑一个场景(C++): 类A和类B,都派生自同一父类。对于类A的每个实例,正好有一个类B的实例 类A保留指向类B的指针,以便在类A的构造函数中创建类B的实例 基本上,在实现中,类A提供了一种从文件(XML)访问数据的方法。事实上,类A中的方法依次调用类B的方法来检索或设置XML中的值。例如,类A有一个用于检索标记值的getter函数,在类A级别执行一些操作(主要是验证)后,类A将委托给类B的getter函数 void GetXMLTagValue (const string& sTa

考虑一个场景(C++):

  • 类A和类B,都派生自同一父类。对于类A的每个实例,正好有一个类B的实例
  • 类A保留指向类B的指针,以便在类A的构造函数中创建类B的实例
  • 基本上,在实现中,类A提供了一种从文件(XML)访问数据的方法。事实上,类A中的方法依次调用类B的方法来检索或设置XML中的值。例如,类A有一个用于检索标记值的getter函数,在类A级别执行一些操作(主要是验证)后,类A将委托给类B的getter函数

     void GetXMLTagValue (const string& sTagName, string& sTagValue)
    
  • 问题:
    在某个场景中,我单独得到了一个类B的实例。我需要调用类a的一个公共非静态方法。有没有推荐的方法来实现这一点?

    最简单的方法就是将指针保持回a。这很容易,因为a构造了B

    尽管如此,关于这个特殊场景背后的设计意图,还是值得你质疑的

    您似乎实现了,其中A是代理(GUI?),B是真正的主体(持久业务对象?)。公共基类是真实对象及其代理的接口。A将请求转发给B

    原则上,代理的目标是提供代理/占位符来控制对真实对象的访问(4组)。您的特殊场景有点不同,因为B将某些内容转发给a:

    目的是什么

    • 必须将B的某些状态更改通知A吗?在本例中,我建议使用并将A函数作为(虚拟)回调函数调用。这样做的好处是,如果你后来得出另一个物体需要被告知的结论,它将很容易进化

    • B是否承担了A没有的责任?B是否应该以更广泛的方式操纵A?然后你可以把B看成是a。它有点像代理。如果你采用decorator方法,你可以在最终客户机和B之间插入其他中间对象,就像在B和A之间一样。但是看到你的一对一关系和A创建B的事实,这将是比添加观察者更彻底的设计变化;我不确定这是否是你在设计中想要的


      • 最简单的方法就是把指针放回a。这很容易,因为a构造了B

        尽管如此,关于这个特殊场景背后的设计意图,还是值得你质疑的

        您似乎实现了,其中A是代理(GUI?),B是真正的主体(持久业务对象?)。公共基类是真实对象及其代理的接口。A将请求转发给B

        原则上,代理的目标是提供代理/占位符来控制对真实对象的访问(4组)。您的特殊场景有点不同,因为B将某些内容转发给a:

        目的是什么

        • 必须将B的某些状态更改通知A吗?在本例中,我建议使用并将A函数作为(虚拟)回调函数调用。这样做的好处是,如果你后来得出另一个物体需要被告知的结论,它将很容易进化

        • B是否承担了A没有的责任?B是否应该以更广泛的方式操纵A?然后你可以把B看成是a。它有点像代理。如果你采用decorator方法,你可以在最终客户机和B之间插入其他中间对象,就像在B和A之间一样。但是看到你的一对一关系和A创建B的事实,这将是比添加观察者更彻底的设计变化;我不确定这是否是你在设计中想要的


        如果不实例化类,就无法调用类的公共非静态方法。“我需要调用类a的公共非静态方法。”-您只能使用
        类a的对象执行此操作。它可以是任何旧对象(需要时创建一个)还是必须是特定对象?@Galik我可以创建一个的对象并调用该方法,但代价很高。(如果没有其他选择,我可能不得不这样做)@object我认为没有其他选择。如果你想调用实例方法,那么你需要一个实例。但是,如果实例方法不引用成员变量,则可以将其设置为静态。如果不实例化类,则无法调用类的公共非静态方法。“我需要调用类a的公共非静态方法。”-您只能使用
        类a
        的对象执行此操作。它可以是任何旧对象(需要时创建一个)还是必须是特定对象?@Galik我可以创建一个的对象并调用该方法,但代价很高。(如果没有其他选择,我可能不得不这样做)@object我认为没有其他选择。如果你想调用实例方法,那么你需要一个实例。但是,如果实例方法不引用成员变量,则可以将其设置为静态。