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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Как сделать аттрибут собственного класса  (Прочитано 21260 раз)
Scotty
Гость
« Ответ #15 : Октябрь 25, 2009, 11:32 »

Немного подрихтовал, но при этом компилятор ругается на
Подрихтовал?  Подмигивающий
Код
C++ (Qt)
Test::Test( const QDomElement &aTest ) :
       gTest( aTest )
{
}
 
Да блин далеко мне ещё до нормального понимания С++ Улыбающийся Спасибо большое !!! Особенно за терпимость к новичкам.
« Последнее редактирование: Октябрь 25, 2009, 11:42 от Scotty » Записан
Scotty
Гость
« Ответ #16 : Октябрь 27, 2009, 23:04 »

Хм, однако есть маленький вопрос, это если делать так, то получается что при каждом обращении будет передаваться объект в тот класс что я получаю методом, так вот, я попробовал переписать так как вы сказали
Немного подрихтовал, но при этом компилятор ругается на
Подрихтовал?  Подмигивающий
Код
C++ (Qt)
Test::Test( const QDomElement &aTest ) :
       gTest( aTest )
{
}
 
И однако есть проблема, объекты из памяти не уходят, программа жрет память в арифметической прогрессии, на каждую итерацию сжирает по 7 Мб памяти (а итераций у меня мно-о-о-о-ого), так не годиться ... может есть соображения как обойти это?
Записан
BRE
Гость
« Ответ #17 : Октябрь 27, 2009, 23:09 »

Покажи свой код, где происходят итерации.
Записан
Scotty
Гость
« Ответ #18 : Октябрь 27, 2009, 23:15 »

Код
C++ (Qt)
   LogSuite * vLogSuite = new LogSuite();
   vLogSuite->openFile("E:/log/RootLogData.dat");
   //qDebug() << "LogPath: " + vLogSuite->getFileName();
 
   ui->textBrowser->append(tr("Папка : ")+vLogSuite->getFilePath());
   ui->textBrowser->append(tr("Файл: ")+vLogSuite->getFileName());
   char buff[10];
   itoa(vLogSuite->getTotalItemsCount(), buff, 10);
   ui->textBrowser->append(tr("Количество элементов: ")+ buff);
   ui->textBrowser->append(tr("== Тестовый элемент 1 =="));
   ui->textBrowser->append(tr("Путь к файлу: ") + vLogSuite->getLogItem(0).getFileName());
   ui->textBrowser->append(tr("Владелец: ") + vLogSuite->getLogItem(0).getOwnerMoniker());
   ui->textBrowser->append(tr("Имя: ") + vLogSuite->getLogItem(0).getName());
 
   itoa(vLogSuite->getLogItem(0).getStatus(), buff, 10);
   ui->textBrowser->append(tr("Статус: ") + buff);
 
   ui->textBrowser->append(tr("Идентификатор : ") + vLogSuite->getLogItem(0).getMoniker());
   ui->textBrowser->append(tr("Ссылка на тест : ") + vLogSuite->getLogItem(0).getTest());
   ui->textBrowser->append(tr("Ключ данных : ") + vLogSuite->getLogItem(0).getPersistentDataKey());
   ui->textBrowser->append(tr("Ключ проекта : ") + vLogSuite->getLogItem(0).getProjectKey());
   ui->textBrowser->append(tr("Относительный путь : ") + vLogSuite->getLogItem(0).getRelativeFileName());
   if (vLogSuite->getLogItem(0).hasChildren()){
     ui->textBrowser->append(tr("Есть дети : ДА"));
     itoa(vLogSuite->getLogItem(0).getChildrenCount(), buff, 10);
     ui->textBrowser->append(tr("Количество детей : ") + buff);
   }
   else
     ui->textBrowser->append(tr("Есть дети : Нет"));
   delete vLogSuite;
 
Записан
BRE
Гость
« Ответ #19 : Октябрь 27, 2009, 23:18 »

Этот код внутри цикла вызывается? Где итерации?  Подмигивающий
Записан
BRE
Гость
« Ответ #20 : Октябрь 27, 2009, 23:21 »

Кстати переводить число в строку проще штатными методами:
Код
C++ (Qt)
QString strNum = QString::number( 123 );
 
Записан
Scotty
Гость
« Ответ #21 : Октябрь 27, 2009, 23:29 »

То что цикла - нет, то я понимаю Улыбающийся Я просто итерацию запихнул в слот и эмулирую так сказать её нажатием на кнопку, жму 5 раз и 5*7=35 мб. как не бывало  Улыбающийся Если я это в обработчик моих логов затолкаю, то там я думаю прощай вся моя оперативка ...
Записан
BRE
Гость
« Ответ #22 : Октябрь 27, 2009, 23:30 »

То что цикла - нет, то я понимаю Улыбающийся Я просто итерацию запихнул в слот и эмулирую так сказать её нажатием на кнопку, жму 5 раз и 5*7=35 мб. как не бывало  Улыбающийся Если я это в обработчик моих логов затолкаю, то там я думаю прощай вся моя оперативка ...
Покажи где создаются объекты Test, где удаляются и т.д.
Записан
Scotty
Гость
« Ответ #23 : Октябрь 27, 2009, 23:40 »

Такс, вот заголовок двух классов (остальные сделаны по аналогии):
Код
C++ (Qt)
class LogItem
{
public:
   LogItem(const QDomElement &aLogItem);
   QString getFileName();
   QString getOwnerMoniker();
   QString getName();
   int getStatus();
   QString getMoniker();
   QString getTest();
   QString getPersistentDataKey();
   QString getProjectKey();
   QString getRelativeFileName();
   bool hasChildren();
   int getChildrenCount();
   LogItemChildren getChildren(int aChildrenindex);
  // QString test(); //for debug
private:
   void setRelativePath(QString aPath);
protected:
   QDomElement gLogItem;
   QString gLogPath;
friend class LogSuite;
};
 
class LogSuite{
public:
   LogSuite();
   int openFile(QString aFileName);
   void closeFile();
   QString getFilePath();
   QString getFileName();
   int getTotalItemsCount();
   LogItem getLogItem(int aItemIndex);
protected:
   QString gLogPath;
   QString gLogFileName;
   QDomDocument * gLogSuiteDocument;
};
 

Такс, конструкторы классов :

Код
C++ (Qt)
 
LogItem::LogItem(const QDomElement &aLogItem):gLogItem(aLogItem){
 
}
 
LogSuite::LogSuite()
{
   gLogSuiteDocument = new QDomDocument;
}
 
Метод получения объекта
Код
C++ (Qt)
LogItem LogSuite::getLogItem(int aItemIndex){
   LogItem vLogItem( gLogSuiteDocument->lastChild().firstChild().childNodes().item(aItemIndex).toElement());
   vLogItem.setRelativePath(this->gLogPath);
   return vLogItem;
}
 
Хм ... а тут я начинаю смутно понимать что создавать то я создаю а вот удалять ... как и где, оно в таком случае где должно освобождать ресурсы? В деструкторе, но где я его вызову если у меня объект как таковой используется для получения только результата метода? Да и как к нему обратиться то?
Записан
BRE
Гость
« Ответ #24 : Октябрь 27, 2009, 23:46 »

А где удаляется gLogSuiteDocument?
Думаю дело в этом.
Записан
Scotty
Гость
« Ответ #25 : Октябрь 27, 2009, 23:55 »

Да Вы вокруг и всюду правы Улыбающийся Я продеструкторы по рассеиности забыл, просто добавил в деструктор класса LogSuite строку удаления примерно так:
Код
C++ (Qt)
LogSuite::~LogSuite()
{
   delete gLogSuiteDocument;
}
 
и память умеренно стала кушаться (и даже возвращаться системе Подмигивающий )... большое спасибо !
« Последнее редактирование: Октябрь 28, 2009, 22:39 от Scotty » Записан
Scotty
Гость
« Ответ #26 : Октябрь 28, 2009, 22:35 »

Наверное не очень в тему, но чтобы не повторяить историю всего этого топика при описании проблемы, хотелось бы задать ещё вопрос. Если я получаю из файла XML строку (она в UTF-8) и сохраняю её в QString'e потом, я прохожу по файлу с помощью тех классов что я описыывал в этом топике и у каждого получаю строку - идентификатор (она должна быть тоже в UTF-8, т.к. берется из того же фала что и та которую я сохранил) и сравниваю с первым значением, но вот проблема - оно не находит совпадений, но совпадения 500% есть я сам руками их нахожу  Злой Незнаю что такое, возможно вопрос опять в кодировке, или я опять глючу Непонимающий
Записан
Scotty
Гость
« Ответ #27 : Октябрь 30, 2009, 00:12 »

Хм, однако ответа - нет  В замешательстве Может всётаки кто нибудь подскажет как мне сравнивать между собою строки взятые из файла??? Я пытался QString::Compare() и == может есть 100%  вариант?
Записан
BRE
Гость
« Ответ #28 : Октябрь 30, 2009, 00:26 »

Хм, однако ответа - нет  В замешательстве Может всётаки кто нибудь подскажет как мне сравнивать между собою строки взятые из файла??? Я пытался QString::Compare() и == может есть 100%  вариант?
Как ты получаешь из файла строку, как ты ее помещаешь в QString. Покажи код.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #29 : Октябрь 30, 2009, 01:59 »

Хм, однако ответа - нет  В замешательстве Может всётаки кто нибудь подскажет как мне сравнивать между собою строки взятые из файла??? Я пытался QString::Compare() и == может есть 100%  вариант?

всегда приводи минимальный компилируемый код, который 100% воспроизводит проблему. А так гадать можно долго Улыбающийся
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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