QVector / QList проблем при използването им със потребителски класове
-
@Stoyan
По този начин сетвам тригерите да.
Функцията искам да е една, еднотипна за всичките обекти.
Проблемът сега се явява отново Segmentation fault при извикване на get някой атрибут на тригер извън globalvars класа. Например в servicе или Scheduler. Понеже понякога /в редки случаи/ не го дава предполагам че е отново реда на създаване на обектите и сетването им. Можеби ще трябва да въведа някакви паузи докато се инициализират нещата,
Интересното е че не излизат атрибутите на тригерите когато ги викам с гетерите в друг клас извън GlobalVars и гърми с грешката. -
BaseObject::actionTriggers в момента изпълнява две съвсем различни неща и ще бъде по-ясно ако ги разделиш в отделни функции, но естествено не е задължително. А функциите, които предложих addTrigger() и delTrigger() пак са в основния клас и са едни и същи и за задачите и за операциите.
А за грешките - ще трябва да качиш промените, за да видя какви са и как се получават.
-
@pecuna91
Трябва да махнеш от BaseObject::actionTriggersnewtrigger->deleteLater();
С него първо добавяш тригера към вектора и веднага след това го изтриваш.
Ето какво се получи без него:Service started!
SSL is supported
Server Listening on port: 1234
"stopped"
Task is disabled
activating task: "Task 2"
Trigger: "time"
"stopped"
Task is disabled
activating task: "Task 2"
Trigger: "time"
....Освен това, защо ти е това Trigger::operator =()? Не можеш ли командите в него да ги изпълниш директно във функцията Trigger::setAll()?
При начина, по който ги използваш в момента, всичките "operator =()" са излишни. И за Trigger, и за Task, и за Operation. -
@Stoyan
Хмм, хем ми направи впечетление за тоя Delete later още на сокетите че го казаха в туториала че прави проблем и го сложих...
Махнах оператор= за тригера, но ми направи впечетление че Copy constructor-а трябва да си стои като дефиниция поне иначе гърми с грешки, но защо изобщо трябва да е дефиниран , но не и реално имплентиран? -
@pecuna91
Не бих казал, че deleteLater() прави проблеми. Понякога дори не може без него. Просто в този случай не прави това, което си си мислел, че прави.Trigger *newtrigger = new Trigger(); // създава се нов обект Trigger като newtrigger е указател към него
newtrigger->setAll(obj); // задават се всички параметри за тригера
newtrigger->deleteLater(); // изтрива се обекта, към който сочи указателя
triggers.push_back(newtrigger); // добавя се указателя към тригера във вектораКогато по-късно използваш triggers.at(i) всъщност взимаш указателя от вектора, но той вече сочи към случаен адрес в паметта. Затова и гърми.
Но когато изтриваш тригер от вектора ще трябва да използваш delete() или deleteLater().Copy constructor-а за Trigger всъщност се използва неявно във функцията GlobalVars::loadTrigger(). Затова и не можеш да го махнеш.
-
@Stoyan
error: passing 'const Operation' as 'this' argument of 'int Operation::setAttribute(QString, QString)' discards qualifiers [-fpermissive]
operations.at(i).setAttribute(Aname,Value);Не мога да разбера защо се получава това съобщение в Task класа, опитвайки се да извикам метода SetAttribute за операция във вектора.
Const Operation не знам откъде идва вътре в тази функция конкретно, след като подавам само id-то на операцията.
Подобна е грешката и при Task сетване на атрибут:
scheduledtopservice\scheduler.cpp:31: error: passing 'const Task' as 'this' argument of 'int Task::setAttribute(QString, QString)' discards qualifiers [-fpermissive]
tasks.at(k).setAttribute("state","running");ПП:
Успях да го реша проблема. Разбрах че .at() връща const обект, затова използвах [i] за индекс.task.cpp:17: warning: base class 'class BaseObject' should be explicitly initialized in the copy constructor [-Wextra]
Task::Task(const Task &obj)
Това как мога да го оправя, четох че създавало още 1 копие на BaseObject така. Но не е като експлицитния конструктор сякаш : BaseObject ( const BaseObject &obj) ако долепя до Copy конструктора на Task. Не съм сигурен, но май просто като сложих : BaseObject() и се изчисти предупреждението. Така ли трябвa да бъде ?