链接器找不到在虚拟类 c++ 中访问的静态字段的符号
Linker can't find symbols for static field accessed in virtual class c++
我正在改进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文件中,全局范围应该可以。
相关文章:
- 如何在复杂继承中访问静态成员变量
- 如何在类内部使用和访问静态指针到成员值s_ptm?
- 从 exe 和 dll 访问静态库中的 extern 变量
- 线程时访问静态映射时出现隔离错误
- C++访问静态 constexpr 数组
- 是否通过单元化指针UB访问静态类成员
- 从多个文件访问静态全局 WinForm UI 对象
- 非静态函数可以访问静态变量吗?
- 为什么可以在没有实例变量的情况下访问静态回调方法中的静态成员变量?
- 如何从 C++ 中的单独类访问静态映射?
- 无法访问静态方法(C )
- 使用静态成员函数访问静态数据成员
- 在CPP中访问静态功能的指针
- 静态模板函数访问静态类成员
- 从成员变量访问静态 constexpr 成员,GCC 错误?
- 静态成员函数访问静态私有变量时的链接器错误
- 将对象数限制为1可以使用点运算符访问静态成员的1
- 为什么我无法访问静态函数中的私有构造函数,如下所示?
- 静态强制转换以访问静态常量类成员
- 访问静态和堆内存的速度