【问题标题】:Linker error and how to access members链接器错误以及如何访问成员
【发布时间】:2015-08-05 14:19:05
【问题描述】:
#include <iostream>
#include <stdlib.h>

class B;

class A {
    int x;
public:
    B it();
    friend class B;
};

class B {
    int y;
    A a;
public:
    B(A aa):y(99), a(aa) {};
    int get_y() {
    return this -> y;
    }
};

using namespace std;

int main() {
    A md;
    cout << md.it().get_y() << endl;

return 0;
}

忽略封装和其他细节,我的问题是我想使用“md.it().get_y()”,但是我的编译器给了我这个链接器错误: 架构 x86_64 的未定义符号: “A::it()”,引用自: main.o 中的 _main ld:未找到架构 x86_64 的符号。 我该如何解决这个问题?

【问题讨论】:

  • 类 B 未完全定义时不能使用,当编译器到达 A 的定义时,它不知道类 B 是什么样的。它只知道有一个类叫 B,所以它不能创建 B 的对象来返回它!解决方案是使用引用或指向对象的指针

标签: c++ class linker linker-errors


【解决方案1】:

EDIT2:意识到这一点之后

B it();

不是返回 B 的函数,而是类 A 中的对象: 您有一个循环依赖,其中 A 使用 B,B 使用 A。编译器无法解决此问题。 转发声明就像

class N;

仅适用于不需要知道实际对象大小的指针或引用

编辑:我刚刚意识到我误读了错误消息。 您缺少 it() 方法的函数定义。

前向声明可能不适用于

B it();

把代码改成

B& it();

应该解决你的问题

请注意,B 现在是通过引用而不是按值返回的。所以你实际上可能会做类似的事情

const B& it() const;

【讨论】:

  • 我按照你的解释改了代码,还是不行
  • 能贴出it()函数的源码吗?
  • it() 不是函数。它是一个 B 对象。我使用“()”作为构造函数
  • 删除 () 它应该可以工作。刚测试,不行,你有循环依赖需要解决
  • 所以我必须使用推导?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 2014-11-12
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多