[英]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 文件中應該可以。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.