簡體   English   中英

未解析的外部符號如何解決? 摘要 class

[英]Unresolved External Symbol how to fix it? abstract class

這是我的摘要 class Storestate.h:

#ifndef STORESTATE_H_
#define STORESTATE_H_

class Store;
class StoreState
{
public:
    virtual void Close(Store&);
    virtual void Open(Store&);
    virtual void Sell(Store&);
};

#endif

派生 class header 文件 ConcreteStateOpened.h:

#ifndef CONCRETESTATEOPENED_H_
#define CONCRETESTATEOPENED_H_
#include "StoreState.h"
#include "Store.h"

class ConcreteStateOpened : public StoreState
{
public:
    ConcreteStateOpened() {}
    void Open(Store&) override;
    void Close(Store&) override;
    void Sell(Store&) override;
};

#endif

Dervied class cpp文件ConcreteStateOpened.cpp:

#include "ConcreteStateOpened.h"
#include <iostream>

using namespace std;

void ConcreteStateOpened::Open(Store &store)
{
    cout << store.Name << " is already opened!" << endl;
}
void ConcreteStateOpened::Close(Store &store)
{
    store.State = ConcreteStateOpened();
}
void ConcreteStateOpened::Sell(Store &store)
{
    std::cout << "Sell Opened";
}

我不知道如何解決這個問題。 我嘗試刪除覆蓋關鍵字以及虛擬關鍵字。 甚至刪除定義等。我只需要專業人士的幫助:,)

以下是未解決的外部符號錯誤:

1>ConcreteStateOpened.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall StoreState::Close(class Store &)" (?Close@StoreState@@UAEXAAVStore@@@Z)
1>Data.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall StoreState::Close(class Store &)" (?Close@StoreState@@UAEXAAVStore@@@Z)
1>StateStore.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall StoreState::Close(class Store &)" (?Close@StoreState@@UAEXAAVStore@@@Z)
1>ConcreteStateOpened.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall StoreState::Open(class Store &)" (?Open@StoreState@@UAEXAAVStore@@@Z)
1>Data.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall StoreState::Open(class Store &)" (?Open@StoreState@@UAEXAAVStore@@@Z)
1>StateStore.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall StoreState::Open(class Store &)" (?Open@StoreState@@UAEXAAVStore@@@Z)
1>ConcreteStateOpened.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall StoreState::Sell(class Store &)" (?Sell@StoreState@@UAEXAAVStore@@@Z)
1>Data.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall StoreState::Sell(class Store &)" (?Sell@StoreState@@UAEXAAVStore@@@Z)
1>StateStore.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall StoreState::Sell(class Store &)" (?Sell@StoreState@@UAEXAAVStore@@@Z)
1>D:\Local-Git-Repos\DesignPatterns\StateC++\StateStore\Debug\StateStore.exe : fatal error LNK1120: 3 unresolved externals

您沒有將抽象基礎中的方法設為純虛擬。 您還應該添加:公共虛擬析構函數、受保護的默認構造函數和刪除復制/移動/賦值構造函數

#ifndef STORESTATE_H_
#define STORESTATE_H_

class Store;
class StoreState
{
public:
    virtual ~StoreState() = default;
    StoreState(const StoreState&) = delete;
    StoreState(StoreState&&) = delete;
    StoreState& operator=(const StoreState&) = delete;

    virtual void Close(Store&) = 0;
    virtual void Open(Store&) = 0;
    virtual void Sell(Store&) = 0;
protected:
    StoreState() = default; // prevent accidental creation
};

#endif

對於初學者,您提供的代碼中沒有抽象 class,因為 class StoreState不包含純虛函數。

來自 C++ 20 標准(11.7.3 抽象類)

2 通過在 class 定義的 function 聲明中使用純說明符 (11.4),將虛擬 function 指定為純虛擬 function。 [注意:這樣的 function 可能會被繼承:見下文。 — 尾注]如果一個 class 至少有一個純虛擬 function,則它是一個抽象 class。 [注:一個抽象 class 只能用作其他一些 class 的基礎 class; 除了從它派生的 class 的子對象(6.2,11.4)之外,不能創建抽象 class 的對象。 — 尾注] 純虛擬 function 僅在調用時才需要定義,或者就好像使用 (11.4.6) 限定的 id 語法

您需要提供在 class StoreState中聲明的虛函數的定義,或者使它們成為純虛函數,例如

class StoreState
{
public:
    virtual void Close(Store&) = 0;
    virtual void Open(Store&) = 0;
    virtual void Sell(Store&) = 0;
};

即使 function 被聲明為純虛函數 function,如果需要,您也可以提供其定義(在聲明為純虛函數的 class 定義之外)。

請注意,當您擁有多態類時,您應該將析構函數也聲明為虛擬的。 例如

class StoreState
{
public:
    virtual ~StoreState() = default;

    virtual void Close(Store&) = 0;
    virtual void Open(Store&) = 0;
    virtual void Sell(Store&) = 0;
};

您的StoreState實際上並不是抽象的。 您已將CloseOpenSell聲明為帶有定義的實際虛函數。 要在 function 中聲明一個沒有定義的虛擬 class,請使用“純虛擬”語法= 0

此外,最好的做法是讓多態 class 類型具有虛擬析構函數。 根據五規則,當你聲明一個析構函數時,一定要考慮復制/移動構造函數和復制/移動賦值。 對於接口 class,通常最好使其不可復制和不可分配。

class StoreState
{
public:
    StoreState() = default;
    StoreState(const StoreState&) = delete;
    StoreState& operator=(const StoreState&) = delete;
    virtual ~StoreState() = default;

    virtual void Close(Store&) = 0;
    virtual void Open(Store&) = 0;
    virtual void Sell(Store&) = 0;
};

您可能需要將虛擬添加到具體的 class 方法中

#ifndef CONCRETESTATEOPENED_H_
#define CONCRETESTATEOPENED_H_
#include "StoreState.h"
#include "Store.h"

class ConcreteStateOpened : public StoreState
{
public:
    ConcreteStateOpened() {}
    virtual void Open(Store&) override;
    virtual void Close(Store&) override;
    virtual void Sell(Store&) override;
};

#endif

暫無
暫無

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

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