gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:48:45 25 4
gpt4 key购买 nike

我正在改进我的 访客模式 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

有谁知道为什么会这样?
我是不是打破了一些神秘的东西 面向对象 规则?

最佳答案

您必须在某处定义变量。像一条线

Visitor* Father::visitor = nullptr;

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

关于c++ - 链接器找不到在虚拟类 C++ 中访问的静态字段的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60261710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com