crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

nikita
  опции профиля:
сообщение 20.3.2013, 11:51
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 34
Регистрация: 19.10.2012
Пользователь №: 3570

Спасибо сказали: 2 раз(а)




Репутация:   0  


Заранее прошу прощения за столь глупый вопрос) Есть код:
...
int x = 3;
...
void MyClass::writeFromFile(QString fileName)
{ ... }


Суть в том, что в методе writeFromFile из файла считывается 2 поля : 'x' и '5'. Можно ли как-то переменной с именем 'x' присвоить считанное значение(в данном случае 5). Если бы Х был полем класса MyClass, то можно было бы воспользоваться методом findChild(), а в этой ситуации я в тупике. Переменных должно быть много и писать процедуру разбора считанной строки с кучей IF-ов не хочется. Подскажите как быть.

Сообщение отредактировал nikita - 20.3.2013, 11:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 11)
lanz
  опции профиля:
сообщение 20.3.2013, 12:55
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Создать QMap<QString, int>, ключ в QMap будет название переменной, а значение - ее значение.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 20.3.2013, 15:53
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


не очень понятно, в чём вопрос.
x - это глобальная переменная или что?
если глобальная, то кто мешает её напрямую юзать? а если не глобальная, то можно передавать указатель на неё как параметр или сделать её статическим членом класса, например. да куча вариантов, вообще говоря.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
nikita
  опции профиля:
сообщение 21.3.2013, 7:34
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 34
Регистрация: 19.10.2012
Пользователь №: 3570

Спасибо сказали: 2 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 20.3.2013, 16:53) *
не очень понятно, в чём вопрос.
x - это глобальная переменная или что?
если глобальная, то кто мешает её напрямую юзать? а если не глобальная, то можно передавать указатель на неё как параметр или сделать её статическим членом класса, например. да куча вариантов, вообще говоря.


X - глобальная переменная не имеющая никакого отношения к классу. Вопрос в том, как переменной с именем QString("x") присвоить значенине. Да, если сделать Х членом класса, то можно юзать метод findChild(), но этот вариант мне не подходит!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 21.3.2013, 7:36
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(nikita @ 21.3.2013, 10:34) *
Вопрос в том, как переменной с именем QString("x")

сделать ассоциацию имя->адрес переменной
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
nikita
  опции профиля:
сообщение 21.3.2013, 7:42
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 34
Регистрация: 19.10.2012
Пользователь №: 3570

Спасибо сказали: 2 раз(а)




Репутация:   0  


Цитата(lanz @ 20.3.2013, 13:55) *
Создать QMap<QString, int>, ключ в QMap будет название переменной, а значение - ее значение.


К сожалению этот вариант мне не подойдет! Получать значение переменной через QMap медленнее чем на прямую по имени переменной, а обращений к этой(им) переменной у меня будет очень много. Поэтому мне кажется, что лучше пожертвовать временем на разбор считанных из файла данных(преременных должно быть 20-25 штук), чем каждый раз тратить лишнее время на обращение к QMap[].
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 21.3.2013, 7:49
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(nikita @ 21.3.2013, 10:42) *
Получать значение переменной через QMap медленнее чем на прямую по имени переменной, а обращений к этой(им) переменной у меня будет очень много. Поэтому мне кажется, что лучше пожертвовать временем на разбор считанных из файла данных(преременных должно быть 20-25 штук), чем каждый раз тратить лишнее время на обращение к QMap[].


http://www.youtube.com/watch?v=lj96YnI9El8

у меня тысячи переменных так работают в реальном времени, и ничего. Кроме того, иного способа, чем ассоциация, тут не придумаешь

а про сравнение времени считывания из файла и обращения к мапе - это совсем забавно ) Это как почта России и электронная почта

Сообщение отредактировал Алексей1153 - 21.3.2013, 8:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 21.3.2013, 8:25
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
обращений к этой(им) переменной у меня будет очень много


Если обращений к конкретной переменной много(очень много(очень очень много(то есть сделано профилирование на готовой программе и доказано что затык в этом месте)), то ее можно закешировать:
int my_var = my_map[var_name];
// много обращений к переменной


А вообще это преждевременная оптимизация.

Сообщение отредактировал lanz - 21.3.2013, 8:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
nikita
  опции профиля:
сообщение 21.3.2013, 8:48
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 34
Регистрация: 19.10.2012
Пользователь №: 3570

Спасибо сказали: 2 раз(а)




Репутация:   0  


Всем спасибо! Как я и сказал в первом сообщении - вопрос был довольно глупым)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 21.3.2013, 9:59
Сообщение #10


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Можно сделать подобное если вынести все твои переменные в отдельный класс, и сделать его сериализацию (переопределить операторы ввода вывода), что-то вроде:
struct CClass
{
    int m_a, m_b, m_c;
    CClass(int a, int b, int c): m_a(a), m_b(b), m_c(c){}
};

std::ostream &operator <<(std::ostream &stream, const CClass &c)
{
    stream << c.m_a << " " << c.m_b << " " << c.m_c;
    return stream;
}

std::istream &operator >>(std::istream &stream, CClass &c)
{
    stream >> c.m_a >> c.m_b >> c.m_c;

    return stream;
}

int main(int , char **)
{
    CClass c(1,2,3);

    std::cout << c << std::endl;
    std::cin >> c;
    std::cout << c << std::endl;

    return 0;
}
Единственное тебе нужно будет поддерживать актуальность сериализуемых данных и все...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 21.3.2013, 16:18
Сообщение #11


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(nikita @ 21.3.2013, 10:34) *
Да, если сделать Х членом класса, то можно юзать метод findChild(), но этот вариант мне не подходит!

собственно, почему не подходит? вообще, глобальные переменные обычно никто не делает глобальными просто так, врассыпную. делают один класс глобальных переменных и объявляют их все статическими. правда, я не знаю, умеeт ли Qt работать с именами статических членов класса. в конце концов, если нужна именно глобальная переменная для совместимости с какими-нибудь чужеродными компиляторами, то её можно сделать глобальной, а в классе глобальных переменных объявить линк и инициализировать его адресом этой переменной.
а в чистом С++ такой встроенной возможности нет. либо делать мап, как уже сказали, либо какие-то другие самодельные списки с именами.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 22.3.2013, 8:25
Сообщение #12


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Как мне кажется нужно идти от задачи.
Если есть много объектов, одинаково форматированных, то надо делать как предложил ViGOur
Если надо один раз загрузить/сохранить настройки программы, то надо использовать QSettings (http://qt-project.org/doc/qt-4.8/qsettings.html)
Если ??? то ???
PROFIT :lol:

Если серьезно, то в чем задача состоит?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 7.6.2025, 16:35