Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Класс связанного дерева 
:(
    Опции темы
Mormishka
Дата 22.7.2011, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет



Пишу класс-граф.
Суть в следущем. Каждый член графа содержит указатель на родительский элемент и указатели на своих "детей". Не могу перегрузить оператор [] который будет указывать на член из класса детей, по его имени, чтоб она также работала как метод 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)
{
}



PM MAIL   Вверх
borisbn
Дата 22.7.2011, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



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

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

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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Mormishka
Дата 23.7.2011, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет



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;


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

Это сообщение отредактировал(а) Mormishka - 23.7.2011, 18:49
PM MAIL   Вверх
borisbn
Дата 23.7.2011, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



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

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



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Mormishka
Дата 23.7.2011, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет



borisbn, 

Да, как-то некрасиво. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.