链接器找不到在虚拟类 c++ 中访问的静态字段的符号

Linker can't find symbols for static field accessed in virtual class c++

本文关键字:访问 静态 字段 符号 c++ 找不到 虚拟 链接      更新时间:2023-10-16

我正在改进c++中的访问者模式代码,该代码最初看起来像下面的代码,以摆脱访问者需要将自身传递到接受空的不必要部分。

我想出了一个简单的解决方案,它将参数"变成"static field这样我就可以在使用accept之前初始化字段。

原谅我,但我需要这样做,即使它会非常丑陋。

旧代码:

class A_Child;
class B_Child;
class Father {
public:
virtual ~Father() = default;
class Visitor {
public:
virtual void visitChildA(A_Child * child) = 0;
virtual void visitChildB(B_Child * child) = 0;
};
virtual void accept(Visitor * visitor) = 0;
};
class A_Child: public Father {
public: /* A Child Stuff */
void accept(Visitor * visitor) override;
};
class B_Child: public Father {
public: /* B Child Stuff */
void accept(Visitor * visitor) override;
};
A_Child::accept(Visitor * visitor) { visitor -> visitChildA(this); }
B_Child::accept(Visitor * visitor) { visitor -> visitChildB(this); }

新代码:

class Father {
public:
virtual ~Father() = default;
class Visitor {
public:
virtual void visitChildA(A_Child * child) = 0;
virtual void visitChildB(B_Child * child) = 0;
};
static Visitor * visitor;
virtual void accept() = 0;
};
// Outside, (assuming NewVisitor: public Father::Visitor):
void NewVisitor::DoStuff(Father * child) {
Father::visitor = this;
child -> accept();
}

链接器投诉:

我的链接器对此不满意,它给了我以下输出:

Undefined symbols for architecture x86_64:
"Father::visitor", referenced from:
Child_A::accept() in Father.o
Child_B::accept() in Father.o
ld: symbol(s) not found for architecture x86_64

有谁知道为什么会这样? 我是否违反了一些神秘的OOP规则?

你必须在某个地方定义变量。像这样的一行

Visitor* Father::visitor = nullptr;

在你的.cpp文件中,全局范围应该可以。