Russian Qt Forum

Qt => Общие вопросы => Тема начата: demaker от Ноябрь 01, 2013, 14:37



Название: new в конструкторе класса
Отправлено: demaker от Ноябрь 01, 2013, 14:37
Помогите разобраться
почему не работает

Код
C++ (Qt)
Station::Station(CommonElement *parent):
 CommonElement(parent)
{    
   layer0 = new CLayer0(this); //программа вылетает
}
 
void Station::setRS485(QString name, BaudRateType baud, ParityType parity)
{
   //layer0 = new CLayer0(this); // то все нормально
   layer0->init_port(name,baud,parity);
   connect(layer0,SIGNAL(showData(QByteArray)),this,SIGNAL(sg_showData(QByteArray)));
}
 
 


Код
C++ (Qt)
class CLayer0: public QObject
{
   Q_OBJECT
 
   Q_PROPERTY (qint64 bytesSent READ getBytesSent WRITE setBytesSent)
   Q_PROPERTY (qint64 bytesReceived READ getBytesReceived WRITE setBytesreceived)
   Q_PROPERTY (bool connected READ getConnected WRITE setConnected)
 
public:      
   explicit CLayer0(QObject* parent = 0);
   virtual ~CLayer0();    
 
public:    
 
   void init_port(QString,BaudRateType,ParityType);
 
   qint64 getBytesSent();
   void setBytesSent(qint64 &);
 
   qint64 getBytesReceived();
   void setBytesreceived(qint64 &);
 
   bool getConnected ();
   void setConnected(bool );
 
   qint64 readData(char * data, qint64 maxSize);
   qint64 writeData(const char * data, qint64 maxSize);
 
Q_SIGNALS:
   void showData(QByteArray);
 
public Q_SLOTS:
   void received();
 
public:
   QextSerialPort *port;
 
private:
  qint64 bytesSent;
  qint64 bytesReceived;
  bool connected;  
};
 


Название: Re: new в конструкторе класса
Отправлено: kambala от Ноябрь 01, 2013, 15:07
1) с какой ошибкой вылетает? что дебаггер показывает?
2) на всякий случай покажи конструктор CLayer0
3) принципиально ли создавать layer0 именно в конструкторе?


Название: Re: new в конструкторе класса
Отправлено: demaker от Ноябрь 01, 2013, 15:21
вылетает просто
Код:
Segmentation fault
код ошибки 255

Код
C++ (Qt)
CLayer0::CLayer0(QObject *parent):
   QObject(parent)
{
   bytesReceived = 0;
   bytesSent = 0;
   connected = false;
   qDebug()<<connected;
}
 

сделал статичным объектом
заработало норм, что за бред ???
Код
C++ (Qt)
 
class Station: public CommonElement
{
   Q_OBJECT
 
public:
   explicit Station(CommonElement *parent = 0);
   virtual ~Station();
 
   CommonElement* appendChild();  
   QVariant getIcon();
   QVariant getHeaderData(int);
   void function();
   void setRS485(QString, BaudRateType, ParityType);
 
Q_SIGNALS:
   void sg_showData(QByteArray);
 
public:
   int amountDevice;
   CLayer0 layer0;  //!!!!!!!!!!!!!!!!!
};
 


Название: Re: new в конструкторе класса
Отправлено: demaker от Ноябрь 01, 2013, 15:24
Убрал this в старой версии
норм все шарится

Почему???
Можете объяснить.
Получается, что в конструкторе лучше this не использовать.


Название: Re: new в конструкторе класса
Отправлено: Alex Custov от Ноябрь 01, 2013, 15:29
Почему???
Можете объяснить.

Потому что ты написал кривой код, поэтому и падает. Если не знаешь где падает - привыкай урезать проект до локализации ошибки, а не бежать на форум с криком "Памагити!!11".


Название: Re: new в конструкторе класса
Отправлено: paff от Ноябрь 06, 2013, 21:25
Потому что конструктор инициализирует объект, а ты на него ссылаешься в конструкторе не создав, его до конца


Название: Re: new в конструкторе класса
Отправлено: deMax от Ноябрь 07, 2013, 07:46
Потому что конструктор инициализирует объект, а ты на него ссылаешься в конструкторе не создав, его до конца
Неправда Ваша. Конструктор вызывается сразу после создания объекта.

Цитировать
Потому что ты написал кривой код, поэтому и падает.
вот причина.

Кстати а зачем ему this передавать? (для UI понятно, интерфейс на иерархии рисуется и деструктится)
Или ты хочешь не писать delete, чтобы родитель за тебя удалил своих детей?