【问题标题】:Pointer to method without variable, how does this code work?指向没有变量的方法的指针,这段代码是如何工作的?
【发布时间】:2019-09-22 08:24:42
【问题描述】:

我遇到了一些我不理解的代码。在类 B 中有一个指向不同类 A 的方法的指针,但该指针没有变量。如何在 B 类中调用此方法? 这是别人更大项目的一部分,我想保留现有代码。

class A {
public:
  A *root() { return this; }
};

class B {
public:
  A *root();
};

我期待这样的事情

A *myA = root();

在 B 类内工作,但我收到链接器错误“未定义对 ... 的引用”。问题更多的是如何调用这种构造,它有什么用以及如何使用它。

【问题讨论】:

  • 如果是int,您会感到惊讶吗?从这个意义上说,指针并不特殊。关于你得到的错误,一些研究应该告诉你它意味着什么以及如何解决它。也就是说,您显示的代码中的任何地方都没有“指向方法的指针”。有一个方法(或成员函数)返回一个指针。
  • 方法 root() 没有实现。这就是您收到链接器错误的原因。
  • A* 只是 B::root 的返回类型,如果您对此感到困惑的话。

标签: c++ class pointers


【解决方案1】:

与 cmets 一样,没有实现 B::root()。也许你的代码在.h 文件旁边有一个.cpp.hpp 文件,B::root() 的实现所在的位置 - 或者存在一个带有它的库。

一个有效的实现可能是A* B::root() { return new A(); }。你可以用 grep 搜索 B::root

拨打B::root(),一个简单的B b; A* as = b.root();就够了。与A::root() 相同,其中一个简单的调用可以是A a; A* as = a.root();

class A {
public:
  A *root() { return this; }
};

class B {
public:
  A *root();
};

A* B::root() { return new A(); }

int main() {
  A a;
  B b;
  A* asa = a.root();
  A* asb = b.root();
  return 0;
}

【讨论】:

  • 顺便说一句,如果你写A* aA *a 没有区别,两者都是指向A的指针,在编译时忽略/删除之间的空格。 Stroustrup 在他的书中使用A* a
  • 感谢您的时间和精力。事后看来很明显......问题是只有一个声明,实施从未完成。我添加了它,它按预期工作。
猜你喜欢
  • 2023-04-04
  • 2023-03-23
  • 2019-05-13
  • 2021-03-22
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
相关资源
最近更新 更多