簡體   English   中英

我需要復制構造函數嗎? 以及如何使用復制構造函數將const對象復制到非const對象

[英]do i need copy constructor ? and how copy const object to non const object using copy constructor

目標:我必須將一個對象復制到另一個對象。

我想到了不使用賦值或復制構造器來復制它,但是它不會編譯。 所以我有使用復制構造器/賦值運算符。

問題
現在我有兩個問題?

1)我真的需要復制構造函數和賦值運算符嗎? 據我所知,我沒有在成員變量中使用任何指針,所以沒有必要使用復制構造函數嗎?

然后我的對象是一個指針,所以我可能需要它嗎?

2)如果我的以下代碼正確,為什么我會收到以下所示的錯誤
無法從“ const Home_instance *”轉換為“ Home_instance *”

home_data.h

struct home_data
{
    QString                           area_address_;
    QVector<QString>                   home_numbers_;
    QMap< QString, QList<QByteArray> > area_to_home_mapping;
};


Home_instance.h

class Home_instance : public QObject
{
    Q_OBJECT

public:
    Home_instance( const Home_data& data, QObject* parent_p = 0 );
    Home_instance();
    Home_instance( const Home_instance& rhs );
    Home_instance& operator=( const Home_instance& rhs );
    ~Home_instance();
// some otehr functions

private:
    Home_data data_;


}

Home_instance.cpp

//constructors

Firmware_instance::Home_instance( )
{
}

Home_instance::Home_instance( const Home_data& data, QObject* parent_p )
: QObject( parent_p ),
  data_  ( data )
{}

Home_instance::Home_instance( const Home_instance& rhs )
{
    data_.ip_address_            = rhs.data_.ip_address_;
    data_.serial_numbers_        = rhs.data_.serial_numbers_;
    data_.serial_to_slot_mapping = rhs.data_.serial_to_slot_mapping;

}

 Home_instance& Home_instance::operator=( const Home_instance& rhs )
 {
    data_.ip_address_            = rhs.data_.ip_address_;
    data_.serial_numbers_        = rhs.data_.serial_numbers_;
    data_.serial_to_slot_mapping = rhs.data_.serial_to_slot_mapping;
    return *this;
 }

Home_instance::~Home_instance()
{
   // do we actually need destructor ?
}

//  in some other Dialog window say Council.h &cpp


class Council
{

// some other variable decl
private:
Home_instance*            Home_instance_p_;
Home_data                 Home_data_p_;

}


in council.cpp

// in constructor 

{


connect( udp_p_,    SIGNAL( discovered_Home( const Home_instance* ) ), this, SLOT( new_Home( const Home_instance* ) ) );
}


// in function new_home

void Council::new_home( const Home_instance* Home_old_instance )

{

// bla bla 

Home_instance_p_  =     Home_old_instance; // error can not convert from 'const Home_instance *' to 'Home_instance *'
}

謝謝

這個

Home_instance_p_  =     Home_old_instance;

不復制對象,而是嘗試復制指針。

你要

Home_instance_p_ = new Home_instance(*Home_old_instance);

然后delete Home_instance_p_~Council

我真的需要復制構造函數和賦值運算符嗎?

通常,我會告訴您是,但是當從QObject繼承一個類時,答案是“否”。 QObject類不是要復制的。

參見: 如何在Qt中復制對象?

無法從“ const Home_instance *”轉換為“ Home_instance *”

是的,因為右手運算符是const指針,而左運算符是非const指針。 有一種稱為const正確性的東西可以防止這種轉換。

這回答了為什么: 新手問題:C ++ const到非const轉換

  1. 假設QList,QMap和QByteArray都具有適當的副本構造函數(或可以使用合成的副本構造函數),則您不需要一個副本構造函數,因為正如您所說的,您沒有需要深層副本的數據。 但是,如果映射,列表和字節數組未正確復制,則需要實現一個(最好的位置在Q類內)

  2. 您試圖將指向const對象的指針復制到指向非const對象的指針。 這與您的副本構造函數無關。 您應該只從方法定義中刪除const(如果需要使用Council :: home_instance_p_來調用非const方法或將成員變量設為const)。

1)我真的需要復制構造函數和賦值運算符嗎? 據我所知,我沒有在成員變量中使用任何指針,所以沒有必要使用復制構造函數嗎?

如果沒有指針,則不需要復制構造函數和賦值運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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