簡體   English   中英

解決私有副本構造函數/副本分配C ++

[英]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::movedata上的想法,因為它需要在調用者的上下文中保持有效的對象。

注意 :我已經聲明該成員為引用(即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.

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