Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Класс связанного дерева


Автор: Mormishka 22.7.2011, 20:44
Пишу класс-граф.
Суть в следущем. Каждый член графа содержит указатель на родительский элемент и указатели на своих "детей". Не могу перегрузить оператор [] который будет указывать на член из класса детей, по его имени, чтоб она также работала как метод GetKeyByName. Я попытался сделать (в комментариях). Но не компилируется.

Код


#ifndef KEYS
#define KEYS
 
#include <QString>
#include <QList>
#include <QStringList>
#include <QFile>
#include <QTextStream>
 
class Key
{
private:
        void AddToString(QString &qstring,Key* key);
public:
        QString Name;
        QStringList Values;
        QList<Key> Children;
        Key(QString Name,Key* Parent);
        Key* Parent;
 
        Key &operator[](QString str);
 
        Key*  GetKeyByName(QString str);
        bool ChildContains(QString qstring);
        void WriteToFile(QString FileName);
        
        ~Key(void);
};
 
#endif // KEYS
 
 
#include "Keys.h"
 
 
Key::Key(QString Name,Key* Parent)
{
        this->Name = Name;
        this->Parent = Parent;
        QList<Key> j;
}
 
//Key* Key::&operator[](QString str)
//{
//      Key* result = NULL;
//      for(int i=0;i<Children.count();i++)
//              if (Children[i].Name == str)
//                      result = &Children[i];
//      return result;
//}
 
Key* Key::GetKeyByName(QString str)
{
        Key* result = NULL;
        for(int i=0;i<Children.count();i++)
                if (Children[i].Name == str)
                        result = &Children[i];
        return result;
}
 
bool Key::ChildContains(QString qstring)
{
        for (int i=0;i<Children.count();i++)
                if (Children[i].Name == qstring)
                        return true;
        return false;
}
 
void Key::WriteToFile(QString FileName)
{
        QFile* file = new QFile(FileName);
        if (!file->open(QIODevice::WriteOnly | QIODevice::Text)) return;
        QTextStream stream(file);
        foreach(Key item,this->Children) {
                stream << item.Name << endl;
                foreach(Key item1, item.Children) {
                        stream << item1.Name << endl;
                        foreach(QString qstr,item1.Values)
                                stream << qstr << " ";
                        stream << endl;
                }
        }
}
 
void Key::AddToString(QString &qstring,Key* key)
{
        //qstring.append//
}
 
Key::~Key(void)
{
}



Автор: borisbn 22.7.2011, 21:04
Цитата(Mormishka @  22.7.2011,  20:44 Найти цитируемый пост)
Key &operator[](QString str);

Цитата(Mormishka @  22.7.2011,  20:44 Найти цитируемый пост)
//Key* Key::&operator[](QString str)

Key & vs Key *
может в этом дело ?

Автор: Mormishka 23.7.2011, 18:48
borisbn, 

В общем я сделал вот так

Код

Key* Key::operator[](QString str)
{
    Key* result = NULL;
    for(int i=0;i<Children.count();i++)
        if (Children[i].Name == str)
            result = &Children[i];
    return result;
}


Но этим не удобно пользоваться, т.к. я пользуюсь указателями. Например

Код

Key key("1",NULL);
key.Children.push_back(Key("2",&key));
QString str = key["2"]->Name;
Key* pKey = &key;

str = (*pKey)[str]->Name;



А вот это не компилируется
Код

str = pKey->[str]->Name;


Приходится писать вот так
Код

str = (*pKey)[str]->Name;


Как то можно избежать операции разименования "*" ? 

Автор: borisbn 23.7.2011, 19:15
Цитата(Mormishka @  23.7.2011,  18:48 Найти цитируемый пост)
Приходится писать вот так

а чем это плохо ? эстетически не нравится ?

Автор: Mormishka 23.7.2011, 19:22
borisbn, 

Да, как-то некрасиво. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)