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

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

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

Доброго времени суток!
Вопрос может показаться немного туповатым но я - не понимаю как оно должно работать.
Предположим есть ситуация:
Код
C++ (Qt)
class B{
public:
 B();
 QString getText();
}
 
class A{
public:
 A();
 B attrB;
}
 
Что собственно хочется:
Когда я разименовываю класс A получить внедркнный объект класса B, иными словами:
Код
C++ (Qt)
QString vSomeText = A->attrB.getText();
Как такое провернуть, непонимаю .... помогите пожалуйста, перерыл много чего, прочитал и про вложеные классы и про friend классы и исходники в Qt смотрел и ничего не понял ... как такое сделать?
« Последнее редактирование: Октябрь 25, 2009, 10:53 от Scotty » Записан
BRE
Гость
« Ответ #1 : Октябрь 25, 2009, 10:07 »

Код
C++ (Qt)
A a;
QString str = a.attrB.getText();
 
A *a = new A;
QString str = a->attrB.getText();
 
Записан
Scotty
Гость
« Ответ #2 : Октябрь 25, 2009, 10:42 »

Всё бы хорошо, но вот компилятор со мною не согласен, пишет что я неверно со ссылками работаю, надо было сразу контекст описывать конкретно, а я написал абстрактно.
Вот так вот пишу:
Заголовочный файл:
Код
C++ (Qt)
#ifndef TESTSUITE_H
#define TESTSUITE_H
#include <QString>
#include <QDomDocument>
#include <QDomNode>
#include <QFileInfo>
 
 
class Test;
class TestSuite;
 
class Test{
public:
   Test();
   Test(QDomElement aTest);
   bool setContent(QDomElement aTest);
   int getTotall();
protected:
   QDomElement * gTest;
};
 
class TestSuite{
public:
   TestSuite();
   int openFile(QString aFileName);
   Test getTest(int aTestItem);
private:
   QString gFilePath;
   QString gFileName;
 
protected:
   QDomDocument * gTestSuite;
 
};
#endif // TEST_H
 

В реализации пишу:
Код
C++ (Qt)
   /********************************
Implementation of class Test
********************************/

Test::Test(){
   gTest = new QDomElement;
}
 
Test::Test(QDomElement &aTest){
   gTest = new QDomElement(aTest);
}
 
bool Test::setContent(QDomElement aTest){
   if (!aTest.isNull()){
       gTest = aTest;
       return true;
   } else
       return false;
}
 
int Test::getTotall(){
   return gTest->attributes().namedItem("totall").nodeValue().toInt();
}
 

В результате компилятор ругается :
E:/Exam/Exam/ExamTest/TestSuite.cpp:47: error: conversion from `Test*' to non-scalar type `Test' requested

У меня только один вопрос, как мне сделать при данном раскладе результат метода TestSuite::getTest(int index), в класс Test.
Это надо чтобы я сделал примерно так:
Код
C++ (Qt)
   TestSuite * vTs = new TestSuite;
   qDebug() << vTs->openFile(QString("E:/Exam/Exam/ExamTest/2.xml"));
   qDebug() << vTs->getTest(1).getTotal();
 
и на консоли получить требуемый аттрибут в XML  Непонимающий
« Последнее редактирование: Октябрь 25, 2009, 10:52 от Scotty » Записан
BRE
Гость
« Ответ #3 : Октябрь 25, 2009, 10:46 »

Код
C++ (Qt)
bool Test::setContent(QDomElement aTest){
   if (!aTest.isNull()){
       *gTest = aTest;
       return true;
   } else
       return false;
}
 
Записан
Scotty
Гость
« Ответ #4 : Октябрь 25, 2009, 10:51 »

Простите но ругается он на этот кусок кода:
Код
C++ (Qt)
Test TestSuite::getTest(int aTestItem){
   Test vTest = new Test(gTestSuite->firstChild().childNodes().item(aTestItem).toElement());
   return vTest;
}
 
С такой вот ошибкой:
  E:/Exam/Exam/ExamTest/TestSuite.cpp:47: error: conversion from `Test*' to non-scalar type `Test' requested
Записан
BRE
Гость
« Ответ #5 : Октябрь 25, 2009, 10:54 »

Код
C++ (Qt)
Test *TestSuite::getTest(int aTestItem){
   Test *vTest = new Test(gTestSuite->firstChild().childNodes().item(aTestItem).toElement());
   return vTest;
}
 
new Class() - возвращает указатель.

Если хочешь возвращать по значению, то в классе Test нужно определить конструктор копирования и оператор =.
Код
C++ (Qt)
Test TestSuite::getTest(int aTestItem){
   Test vTest(gTestSuite->firstChild().childNodes().item(aTestItem).toElement());
   return vTest;
}
 
« Последнее редактирование: Октябрь 25, 2009, 10:58 от BRE » Записан
Scotty
Гость
« Ответ #6 : Октябрь 25, 2009, 10:56 »

 Смеющийся Вернул ссылку и всё ... вроде заработало Улыбающийся
Записан
spectre71
Гость
« Ответ #7 : Октябрь 25, 2009, 10:57 »

Простите но ругается он на этот кусок кода:
Код
C++ (Qt)
Test TestSuite::getTest(int aTestItem){
   Test vTest = new Test(gTestSuite->firstChild().childNodes().item(aTestItem).toElement());
   return vTest;
}
 
С такой вот ошибкой:
  E:/Exam/Exam/ExamTest/TestSuite.cpp:47: error: conversion from `Test*' to non-scalar type `Test' requested



Код
C++ (Qt)
Test TestSuite::getTest(int aTestItem){
   Test* vTest = new Test(gTestSuite->firstChild().childNodes().item(aTestItem).toElement());
   return *vTest;
}
 
 
Записан
BRE
Гость
« Ответ #8 : Октябрь 25, 2009, 11:00 »

Код
C++ (Qt)
Test TestSuite::getTest(int aTestItem){
   Test* vTest = new Test(gTestSuite->firstChild().childNodes().item(aTestItem).toElement());
   return *vTest;
}
 
Ох с удалением этого объекта еще вопросы возникнут.  Улыбающийся
Записан
Scotty
Гость
« Ответ #9 : Октябрь 25, 2009, 11:04 »

Ага, вот я и говорю вернул ссылку и всё стало волшебно работать, вот только немного не понимаю почему когда пишу результат - класс а возвращаю не экземпляр класса а ссылку на него  Непонимающий Это я конечно могу принять на веру и посчитать что так надо, но может есть тому логичное объяснение?
Записан
Scotty
Гость
« Ответ #10 : Октябрь 25, 2009, 11:07 »

Цитировать
Ох с удалением этого объекта еще вопросы возникнут. Улыбающийся
А ведь и вправду, как я его потом удалять буду если я ссылку на него один раз получу, воспользуюсь тем чем надо а что дальше Непонимающий Улыбающийся Как мне его из памяти то убрать Непонимающий При следующем обращении создастся новый объект и вернется ссылка на новый экземпляр  Шокированный
« Последнее редактирование: Октябрь 25, 2009, 11:11 от Scotty » Записан
BRE
Гость
« Ответ #11 : Октябрь 25, 2009, 11:15 »

Попробуй так переписать:
Код
C++ (Qt)
class Test{
public:
   Test();
   Test( const QDomElement &aTest );
   bool setContent( const QDomElement &aTest );
   int getTotall();
protected:
   QDomElement gTest;
};
 
Test::Test()
{
}
 
Test::Test( const QDomElement &aTest ) :
gTest( aTest )
{
}
 
bool Test::setContent( const QDomElement &aTest )
{
   if (!aTest.isNull()){
       gTest = aTest;
       return true;
   } else
       return false;
}
 
int Test::getTotall(){
   return gTest.attributes().namedItem("totall").nodeValue().toInt();
}
 

Код
C++ (Qt)
Test TestSuite::getTest(int aTestItem){
   Test vTest( gTestSuite->firstChild().childNodes().item(aTestItem).toElement() );
   return vTest;
}
 
Записан
spectre71
Гость
« Ответ #12 : Октябрь 25, 2009, 11:26 »

Цитировать
Ох с удалением этого объекта еще вопросы возникнут. Улыбающийся
А ведь и вправду, как я его потом удалять буду если я ссылку на него один раз получу, воспользуюсь тем чем надо а что дальше Непонимающий Улыбающийся Как мне его из памяти то убрать Непонимающий При следующем обращении создастся новый объект и вернется ссылка на новый экземпляр  Шокированный

Естественно!
Вариантов как правильно сделать много, все зависит от твоей задачи.

Код
C++ (Qt)
Test TestSuite::getTest(int aTestItem){
   Test vTest(...);
   return Test(...);
}
 
////////////
 
Test* TestSuite::getTest(int aTestItem){
   return new Test(...);
}
 
////////////
 
class TestSuite {
 ...
 ...
 Test* tmpTest;
 ...
 ...
}
 
Test& TestSuite::getTest(int aTestItem){
   if(tmpTest) {delete tmpTest;}
   tmpTest = new Test(...);
   return *tmpTest;
}
 


ИТД...
Записан
Scotty
Гость
« Ответ #13 : Октябрь 25, 2009, 11:27 »

Немного подрихтовал, но при этом компилятор ругается на
Код
C++ (Qt)
Test::Test(const QDomElement &aTest){
   gTest(aTest);
}
 
E:/Exam/Exam/ExamTest/TestSuite.cpp:61: error: no match for call to `(QDomElement) (const QDomElement&)'
Записан
BRE
Гость
« Ответ #14 : Октябрь 25, 2009, 11:29 »

Немного подрихтовал, но при этом компилятор ругается на
Подрихтовал?  Подмигивающий
Код
C++ (Qt)
Test::Test( const QDomElement &aTest ) :
       gTest( aTest )
{
}
 
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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