下面的代碼說明了我的意圖。https://godbolt.org/z/dhhascnoo
#include<string>
#include<sstream>
#include<iomanip>
#include<iostream>
#include< memory>
class Dbg
{
protected:
bool enabled;
public:
Dbg() : enabled(false){}。
Dbg(bool enable) : enabled(enable){}。
void print()
{
if ( enabled) {
std::cout << "除錯!" << std::endl;
}
}
};
class C1
{
protected:
std::shared_ptr<Dbg> dbg。
public:
C1() { dbg = std::make_shared<Dbg> (false); }
C1(std::shared_ptr<Dbg> dbg) : dbg(dbg) {}.
void print()
{
dbg->print()。
}
};
class C0
{
protected:
std::shared_ptr<Dbg> dbg;
C1 c1Inst;
public:
C0() : c1Inst(dbg) { dbg = std::make_shared<Dbg> (false); }
C0(std::shared_ptr<Dbg> dbg) : dbg(dbg) {}.
void run()
{
c1Inst.print()。
}
};
int main()
{
std::shared_ptr<Dbg> dbg = std::make_shared<Dbg> (true)。
C0 c0Inst;
c0Inst.run()。
基本上,我有一些實用類,我想把它傳遞給我運行的大多數物件。具有列印出日志資訊的能力(可組態檔來記錄這些資訊)。
我打算將這個實用程式物件的 shared_ptr 傳遞給我所有的子類。然而,我啟動這些類的構造器的方式似乎有些不妥,導致了 segfault。
我對建構式的設計不是很了解,所以也許有人能發現我的錯誤?
編輯
編輯:我意識到我的錯誤在于沒有在main中傳遞 盡管如此, uj5u.com熱心網友回復: 你的代碼有未定義的行為,由于呼叫單元化的 在類 這將從dbg的實際指標(doh!)。它應該是:int main()
{
std::shared_ptr<Dbg> dbg = std::make_shared<Dbg> (true)。
C0 c0Inst(dbg)。
c0Inst.run()。
}
C0的默認建構式應該創建一個新的Dbg物件來參考,不是嗎?
std::shared_ptr<Dbg>。C0中,你沒有在其默認建構式中初始化成員C1 c1Inst;(即C0():...)。然后你從該類中呼叫run()void run(){
c1Inst.print()。
}
C1運行print,在這里你沒有再次初始化std::shared_ptr<Dbg>dbg;。這是未定義的行為。
為了解決這個問題,你只需要把C0的約束符改為
C0( )
: dbg{ std::make_shared<Dbg>(false) }, c1Inst{ dbg{ dbg>(false)
, c1Inst{ dbg }
{}
C0(std::shared_ptr<Dbg> dbg)
: dbg(dbg)
, c1Inst{ dbg }
{}
這樣,在使用該類之前,該類的所有成員將被正確初始化。下面是一個演示
uj5u.com熱心網友回復:
正如所說,你把nullptr傳給C1,因為初始化器串列在構造器之前被呼叫。
C0(): c1Inst(dbg) {dbg=std::...所以你基本上沒有初始化C1的指標。
為了解決這個問題,你應該先初始化一個指標,例如把默認建構式改為:
C0( )
{
dbg = std::make_shared<Dbg> (false)。
c1Inst = C1(dbg)。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/328117.html
標籤:
上一篇:將二進制檔案轉換為0和1的字串
下一篇:什么是Java中的密封類17
