【问题标题】:do i need copy constructor ? and how copy const object to non const object using copy constructor我需要复制构造函数吗?以及如何使用复制构造函数将 const 对象复制到非 const 对象
【发布时间】:2014-01-22 13:56:04
【问题描述】:

目标:我必须将一个对象复制到另一个对象中。

我想在不使用赋值或复制构造函数的情况下复制它,但它无法编译。所以我使用了复制构造器/赋值运算符。

问题
. 现在我有 2 个问题?

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 *'
}

谢谢

【问题讨论】:

    标签: c++ constructor copy constants


    【解决方案1】:

    这个

    Home_instance_p_  =     Home_old_instance;
    

    不复制对象,它尝试复制指针。

    你想要

    Home_instance_p_ = new Home_instance(*Home_old_instance);
    

    然后将delete Home_instance_p_ 输入~Council

    【讨论】:

    • 可能值得一提的是,他此时需要一个委员会析构函数来删除已创建的 Home_instance_p_。
    • @Henrik,谢谢,但我想知道我需要复制构造函数吗?
    • @samprat 如 Jmc 的回答中所述,您可能不需要。
    【解决方案2】:

    我真的需要复制构造函数和赋值运算符吗?

    通常,我会告诉你是的,但是当有一个从 QObject 继承的类时,答案是否定的。 QObject 类不应该被复制。

    看到这个:How do I copy object in Qt?

    无法从 'const Home_instance *' 转换为 'Home_instance *'

    是的,因为右手操作符是 const 指针,而左操作符是非常量指针。有一种叫做 const 正确性的东西会阻止这种转换。

    这回答了原因:newbie question: c++ const to non-const conversion

    【讨论】:

      【解决方案3】:
      1. 假设 QList、QMap 和 QByteArray 都具有适当的复制构造函数(或者可以使用合成的构造函数),您不需要一个,因为正如您所说,您没有需要深拷贝的数据。但是,如果 map、list 和 bytearray 没有正确复制,则需要实现一个(最好的位置是 Q 类)

      2. 您正在尝试将指向 const 对象的指针复制到指向非 const 对象的指针。这与您的复制构造函数没有任何关系。您应该从方法定义中删除 const(如果需要使用 Council::home_instance_p_ 来调用非常量方法或使您的成员变量为 const)。

      【讨论】:

        【解决方案4】:

        1) 我真的需要复制构造函数和赋值运算符吗?据,直到...为止 我知道我没有在成员变量中使用任何指针,所以没有 需要使用拷贝构造函数吗?

        如果没有指针,则不需要复制构造函数和赋值运算符。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-01
          • 2017-03-26
          • 1970-01-01
          • 2010-12-22
          • 1970-01-01
          • 2013-06-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多