[英]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
實際上並不是抽象的。 您已將Close
、 Open
、 Sell
聲明為帶有定義的實際虛函數。 要在 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.