首页 > 解决方案 > 链接器找不到在虚拟类 C++ 中访问的静态字段的符号

问题描述

我正在改进我的C++中的访问者模式代码,它最初看起来像下面的代码,以便摆脱访问者需要将自己传递给接受无效的不必要部分。

我想出了一个简单的解决方案,将参数“转换”为 a 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规则?

标签: c++oopstatic

解决方案


您必须在某个地方定义变量。像一条线

Visitor* Father::visitor = nullptr;

在全局范围内的 .cpp 文件中应该这样做。


推荐阅读