我對 c 語言非常陌生,并且擁有廣泛的 c# 背景。我在 Visual Studio 2022 中設定了一個解決方案,該解決方案由一個控制臺可執行專案和一個 dll 專案組成,可執行檔案取決于 dll 專案。
dll 依賴于其他一些靜態庫來最終提供類似 httpclient 的功能。
這些專案是我更多了解 C 的游樂場。我決定在 exe 和 dll 之間需要 ac# 類的功能,所以我從 dll 匯出了一個類class MyHttpClient。
我的第一個嘗試是將這個類作為一個整體匯出,但這導致 exe 依賴于 dll 所依賴的一些庫,因為該類的成員欄位的型別來自這些庫,即使構建成功exe會崩潰..
所以我決定在一個單獨的干凈頭檔案中創建一個只有公共建構式和關鍵公共函式的介面類;這個類與完整類具有相同的名稱和相同的名稱空間,我使用基于它所在專案的類__declspec(dllexport)的預定義宏來裝飾這個抽象類__decspec(dllexport/import),并將這個頭檔案匯入我的 exe 主檔案。ps 請注意,全班也用__declspec(dllexport).
//inteface.h
#include "def.h"
//This is the abstract(interface) class
class EXPORT_API MyHttpClient
{
public:
MyHttpClient();
std::string Get();
};
exe 中的 main.cpp 包含 interface.h 檔案。
//MyHttpClient.h
//Multiple #include "def.h" ...
class EXPORT_API MyHttpClient
{
public:
MyHttpClient();
std::string Get();
private:
// some member fields
};
//MyHttpClient.cpp
provides implementation for the MyHttpClient class
現在發生了什么:
#include "inteface.h"
int main()
{
// if I declare the class's object on the stack everything works as intended.
MyHttpClient client;
auto result = client.Get();
//if I set it on the heap the program crashes with Access violation
// on the private members as if they were not there!!
HttpClient* cli = new HttpClient;
auto result = cli->Get(); // crash
...
}
Q1:為什么我會看到這樣的行為?我懷疑新運算子呼叫抽象類的大小,因此所有欄位都沒有分配記憶體,而堆疊呼叫建構式(這些成員在其中初始化)并隨著這些成員的初始化而擴展(這是我的猜測,但我真的不知道!)。
Q2:如何解決這個問題?
謝謝你。
uj5u.com熱心網友回復:
所以我決定在一個單獨的干凈頭檔案中創建一個只有公共建構式和關鍵公共函式的介面類;這個類與整個類具有相同的名稱和相同的命名空間
這違反了單一定義規則并導致您的程式具有未定義的行為。不同翻譯單元中同一類的定義必須由相同的標記序列構成(加上一些額外的要求)。
如果您想要一個抽象類作為介面,請使用繼承和(純)虛函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/440024.html
下一篇:如果我減少分配給ElasticSearchforAzureDevopsServerExpress的RAM量怎么辦?
