Russian Qt Forum
Ноябрь 25, 2024, 02:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: new в конструкторе класса  (Прочитано 22783 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« : Ноябрь 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;  
};
 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Ноябрь 01, 2013, 15:07 »

1) с какой ошибкой вылетает? что дебаггер показывает?
2) на всякий случай покажи конструктор CLayer0
3) принципиально ли создавать layer0 именно в конструкторе?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #2 : Ноябрь 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;  //!!!!!!!!!!!!!!!!!
};
 
« Последнее редактирование: Ноябрь 01, 2013, 15:23 от demaker » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #3 : Ноябрь 01, 2013, 15:24 »

Убрал this в старой версии
норм все шарится

Почему???
Можете объяснить.
Получается, что в конструкторе лучше this не использовать.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Ноябрь 01, 2013, 15:29 »

Почему???
Можете объяснить.

Потому что ты написал кривой код, поэтому и падает. Если не знаешь где падает - привыкай урезать проект до локализации ошибки, а не бежать на форум с криком "Памагити!!11".
Записан
paff
Гость
« Ответ #5 : Ноябрь 06, 2013, 21:25 »

Потому что конструктор инициализирует объект, а ты на него ссылаешься в конструкторе не создав, его до конца
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #6 : Ноябрь 07, 2013, 07:46 »

Потому что конструктор инициализирует объект, а ты на него ссылаешься в конструкторе не создав, его до конца
Неправда Ваша. Конструктор вызывается сразу после создания объекта.

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

Кстати а зачем ему this передавать? (для UI понятно, интерфейс на иерархии рисуется и деструктится)
Или ты хочешь не писать delete, чтобы родитель за тебя удалил своих детей?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.124 секунд. Запросов: 22.