从C++中的同一个类中的另一个方法调用方法

dev*_*vin 31 c++ methods

a()在课堂上写了一个方法(工作正常).我想在该类中编写另一个调用第一个方法的方法:

void A::a() {
  do_stuff;
}

void A::b() {
  a();
  do_stuff;
}
Run Code Online (Sandbox Code Playgroud)

我想我可以改写b(),b(A obj)但我不想.在java中你可以做类似的事情this.a().

我想这样做obj.b()在那里obj.a()会被称为的结果obj.b().

Ecl*_*pse 42

你有什么应该工作正常.如果您愿意,可以使用"this":

void A::b() {
  this->a();
  do_stuff;
}
Run Code Online (Sandbox Code Playgroud)

要么

void A::b() {
  this->A::a();
  do_stuff;
}
Run Code Online (Sandbox Code Playgroud)

要么

void A::b() {
  A::a();
  do_stuff;
}
Run Code Online (Sandbox Code Playgroud)

但你有什么也应该工作:

void A::b() {
  a();
  do_stuff;
}
Run Code Online (Sandbox Code Playgroud)

  • 我收到一个错误:`在非成员函数中无效使用'this' (3认同)
  • 在引用类的方法/属性时使用`this`是更好的做法吗? (3认同)

ral*_*nja 24

这正是你在做的事情.

  • 这里的答案^^^没有用;下面的 +44 分更有洞察力。从长远来看,我建议更改顺序。我将解释原因:我通过 Google 来到这里,答案对我没有帮助 - 但下面的语法的答案让我意识到我只是忘记了一个 ()。因此,下面的+44分答案对我的情况更有帮助,而“你在做什么”评论实际上几乎没有增加任何内容。 (7认同)

Tim*_*upe 5

看起来您在块中编写的代码可以正常工作。只要确保在类中正确定义了 a() 和 b() 方法。


MSa*_*ers 5

在一种情况下,您可能会得到一些意想不到的结果。也就是说,如果A::a()是 virtual,obj实际上具有 type DerivedFromA,并且 DerivedFromA::a 会覆盖A::a。在这种情况下,简单调用a();或更详细的调用this->a();将不会调用 A::a,而是调用 DerivedFromA::a()。

现在,这可能是有意的,因为 A 类将 a() 声明为虚拟的。但如果你真的不是这个意思,你可以通过将调用编写为来忽略虚拟

void A::b()
{
    A::a(); // or
    this->A::a(); //Both ignore the virtual-ness of a()
}    
Run Code Online (Sandbox Code Playgroud)