4

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

我有 ;

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 ?

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

4

9 回答 9

1

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

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

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

于 2012-05-27T07:29:17.233 回答
1

使用公共继承:

class B {
 public:
  void bar();
};

class A : public B
{ };

int main() {
 A a;
 a.bar();
}
于 2012-05-27T07:33:59.510 回答
0

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

于 2012-05-27T07:09:29.220 回答
0

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

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();
}
于 2013-11-14T21:29:55.657 回答
0

目前尚不清楚您想做data.bar()什么。

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

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

如果你想使用 B,你可以在 A 中拥有一个 B 的实例。阅读关于优先组合而不是继承的信息

于 2012-05-27T07:41:37.677 回答
0

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

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

于 2012-05-27T09:24:06.197 回答
0

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

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

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

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

A a;
B* b = (B*)&a;
b->bar();
于 2012-05-27T08:44:44.500 回答
0

您还可以将 class 声明Bfriendof class A

我相信它的语法是:

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

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

于 2014-06-18T02:39:18.893 回答
-1

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

class A: public B

类型转换

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

或重新诠释演员表

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

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

于 2014-12-30T04:33:45.403 回答