c++ - 链接器找不到在虚拟类 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规则?
解决方案
您必须在某个地方定义变量。像一条线
Visitor* Father::visitor = nullptr;
在全局范围内的 .cpp 文件中应该这样做。
推荐阅读
- apache2 - 尝试连接到新环境时出现 503 错误
- python - 有什么方法可以显示 .py 文件的图标吗?
- mysql - Laravel 在 whereHas 中的多个 where 子句约束 hasMany 关系
- php - PHP使用变量创建MySQL数据库
- ansible - 如何使用 Ansible Dynamic Inventory for AWS 显示标签名称?
- php - 在图片中添加版权网址
- python - 合并多个熊猫数据框而不重复列
- javascript - Puppeteer:出现 TimeoutError 错误后重复该过程
- python-3.x - 我无法在 M1 mac 上安装 pyaudio
- c - 在二进制文件中激发一个条件