[英]C++ initialize list assignment in copy constructor and crashing in copy constructor
[英]Getting around private copy constructor/copy assignment C++
我有一個對象,在初始化時會傳遞一個大數據結構:
class foo {
public:
foo(const BigData& data);
command();
}
BigData
的副本構造函數和副本賦值運算符是私有的,這是正確的。
但是,我需要更改class foo
以便command()
可以訪問BigData
。 鑒於程序的結構,傳遞command(const BigData& data)
非常困難,因此我想執行以下操作:
class foo {
public:
foo(const BigData& data);
command();
private:
BigData m_data;
}
但是,如何在沒有復制構造函數或復制分配的情況下初始化m_data
? 我也不喜歡std::move
在data
上的想法,因為它需要在調用者的上下文中保持有效的對象。
注意 :我已經聲明該成員為引用(即const BigData& m_data
),但這不能在icpc下編譯:
error: foo provides no initializer for reference member "m_data"
我用過foo(const BigData& data) : m_data(data)
以及foo(const BigData& data) { m_data = data; }
foo(const BigData& data) { m_data = data; }
。
如何存儲參考?
class foo
{
public:
foo(const BigData& data) : m_data(data) {}
command();
private:
const BigData & m_data;
};
如果BigData
沒有副本構造函數和賦值運算符,那么作者不希望您為其復制副本。 但是,您可以自己對其進行const
引用,如下所示:
class foo {
public:
foo(const BigData& data) : m_data(data) {}
command();
private:
const BigData &m_data;
};
現在,您的command()
成員函數可以訪問已傳遞給foo
的構造函數的BigData
。
要記住的重要一點是, BigData
對象的生存期與foo
對象的生存期BigData
。 您需要確保在foo::command()
運行時,已經存在傳遞給foo
的構造函數的BigData
。 否則,由於懸空的引用,您的程序將具有未定義的行為。
另一種選擇是使您自己的類類似於BigData
,並從其類中復制一個到您的類中。 但是,就編程工作而言,這可能是令人望而卻步的。
class foo {
public:
foo(const BigData& data);
command();
private:
const BigData& m_data;
}
// constructor
foo::foo(const BigData& data)
: m_data( data )
{
// usual stuff
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.