TARGET:我必须将一个对象复制到另一个对象中。
我想过在不使用赋值或复制构造函数的情况下复制它,但它没有编译。所以我使用了copy contructor / assignment operator。
问题
。
现在我有两个问题?
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 *'
}
谢谢
答案 0 :(得分:2)
此
Home_instance_p_ = Home_old_instance;
不复制对象,它会尝试复制指针。
你想要
Home_instance_p_ = new Home_instance(*Home_old_instance);
然后delete Home_instance_p_
中的~Council
。
答案 1 :(得分:2)
我真的需要复制构造函数&amp;赋值运算符?
通常情况下,我会告诉你YES,但是当有一个继承自QObject的类时,答案是否定的。 QObject类不是要复制的。
请参阅:How do I copy object in Qt?
无法从'const Home_instance *'转换为'Home_instance *'
是的,因为右手操作符是const指针,而左边是非const指针。有一种叫做const正确性的东西会阻止这种转换。
答案 2 :(得分:1)
假设QList,QMap和QByteArray都有正确的复制构造函数(或者可以使用合成的复制构造函数),您不需要一个,因为正如您所说,您没有需要深层复制的数据。但是,如果map,list和bytearray没有正确复制,则需要实现一个(最好的位置在Q类中)
您正在尝试将指向const对象的指针复制到指向非const对象的指针。这与您的复制构造函数没有任何关系。你应该从方法定义中删除const(如果需要使用Council :: home_instance_p_来调用非const方法或使你的成员变量为const)。
答案 3 :(得分:-1)
1)我真的需要复制构造函数&amp;赋值运算符?据,直到...为止 我知道我没有在成员变量中使用任何指针,所以没有 需要使用复制构造函数吗?
如果没有指针,则不需要复制构造函数&amp;赋值运算符。