【问题标题】:How to Call Function of one class on the object of another class?如何在另一个类的对象上调用一个类的函数?
【发布时间】:2012-05-27 07:05:05
【问题描述】:

如何在一个类中调用一个方法而不是使用另一个类?

我有;

class A { 
 public :
  foo ( ) ;
};

class B {
 public :
  bar ( ) ;
};

主要:

A data ;          // I am creating instance of class A 

data . bar ( ) ;  //  but, I am calling a method of another class

                  // how can I do that ?

注意:我找不到合适的标题。如果您有,请随时分享或编辑

【问题讨论】:

标签: c++ oop class function function-call


【解决方案1】:

除非这两个类是相关的(通过继承)你不能这样做。

成员函数对其所属类的实例执行一些操作。
您创建了一个 A 类的对象,因此您只能通过它调用 A 的成员函数。

磨苹果并希望得到芒果奶昔,这不会真的发生。

【讨论】:

    【解决方案2】:

    使用公共继承:

    class B {
     public:
      void bar();
    };
    
    class A : public B
    { };
    
    int main() {
     A a;
     a.bar();
    }
    

    【讨论】:

      【解决方案3】:

      我想如果你想在 A 对象上使用 .bar() 必须由 B 继承。

      【讨论】:

      • ?答案:“B 类:A 类”
      • 那是私有继承。它可能无法实现 OP 想要的。
      【解决方案4】:

      不清楚你想让data.bar()做什么。

      bar() 因为无法访问 A 的数据,所以bar() 不能与变量data 有任何关系。所以,我认为data.bar() 是不必要的,你的目标只是bar()。 想必如果bar()只是一个函数,可以声明static并调用B.data()

      另一个选择是你想要一些其他人已经写过的继承。小心继承,并确保只有在存在 is-a 关系并且满足 Liskov Principle 时才从 B 继承 A。不要仅仅因为你必须调用bar()而从B继承。

      如果你想使用 B,你可以在 A 中拥有一个 B 的实例。阅读prefering composition over inheritance

      【讨论】:

        【解决方案5】:

        正如每个人在回答中所说的那样。 这是个坏主意,而且不可能。

        你只能使用没有人真正知道它会如何表现的技巧。

        您可以获取对象 A 的指针并将其转换为 B 的指针。

        同样,它的唯一用途是向其他人展示不该做什么。

        A a;
        B* b = (B*)&a;
        b->bar();
        

        【讨论】:

          【解决方案6】:

          我认为您应该阅读 1 或 2 c plus plus 书籍,并大致了解课程的内容以及它们的用途。

          一些建议:Bjarne Stroustrup 的 c++ 编程或 Bruce Eckel 的 Thinking in c++ 或在网上搜索教程。

          【讨论】:

            【解决方案7】:

            您可以使用函数指针。使它不是静态的唯一方法是使用模板。

            class A
            { 
              public:
              void setBar(void (*B::func)(void)) { bar = func; };
              void callBar() { bar(); };
            
              private:
              void(*B::bar)(void);
            };
            
            class B
            {
              public:
              static void bar() { printf("you called bar!"); };
            };
            
            int main() {
              A a;
              a.setBar(B::bar);
              a.callBar();
            }
            

            【讨论】:

              【解决方案8】:

              您还可以将B 类声明为A 类的friend

              我相信它的语法是:

              class A {
                  public:
                      foo();
                  friend class B;
              };
              class B {
                  public:
                      bar();
              };
              

              但是有了这个,我相信你只能在B 函数中使用来自A 的函数/变量。 继承可能是您更好的方法。

              【讨论】:

                【解决方案9】:

                虽然这个问题很奇怪!但这里有一些解决方案 使用继承

                class A: public B
                

                类型转换

                A data;
                ((B*)&data)->bar();
                

                或者重新解释演员表

                B* b = reinterpret_cast <B*> (&data);
                b->bar();
                

                如果 bar() 使用 B 的任何成员变量,则结果不可预测。

                【讨论】:

                • 演员表版本都导致未定义的行为
                • 两个演员表实际上是等价的。如果 bar() 没有使用 B 形式的任何非静态成员变量,则可以将其指定为静态成员函数,不会产生任何错误或影响。
                • 如果 bar() 没有使用 B 形式的任何非静态成员变量,它的行为就像一个静态函数。它可以被指定为静态成员函数,没有任何错误或副作用。然后可以使用 B* 类型的任何有效指针来调用 bar() 而不会出错。试试吧!
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-01-09
                • 2018-08-17
                • 2019-11-29
                • 1970-01-01
                相关资源
                最近更新 更多