簡體   English   中英

鏈接器找不到在虛擬類 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 文件中應該可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM