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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: классы&ссылки  (Прочитано 5846 раз)
vanessa
Гость
« : Май 03, 2011, 13:59 »

Код:
class RefTest
{
public:
RefTest():
var0(array[0]),
var1(array[1]),
var2(array[2]),
var3(array[3]),
var4(array[4]),
var5(array[5]),
var6(array[6]),
var7(array[7]),
var8(array[8]),
var9(array[9]),
 {}
private:
int array[10];
int &var0;
int &var1;
int &var2;
int &var3;
int &var4;
int &var5;
int &var6;
int &var7;
int &var8;
int &var9;
};

Вот такая слегка запутанная конструкция инициализации ссылки...
Есть ли вариант попроще ?

Зачем оно нужно ? например для того чтобы иметь доступ к данным класса разными методами, внутри методов класса хочется работать с именами переменных, а наружу выдавать массив этих переменных.

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Май 03, 2011, 14:05 »

Что-то оно ужасно выглядит и профита я не вижу.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
RedDog
Гость
« Ответ #2 : Май 03, 2011, 14:15 »

Мне почему то всегда казалось, что член класса не может быть ссылкой
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Май 03, 2011, 14:19 »

Может лучше emun использовать? Если я, конечно, правильно понял.
Код
C++ (Qt)
class RefTest
{
public:
 enum Var {var_0 = 0, var_1, ...., var_count}
public:
RefTest()
{}
private:
int array[var_count];
};
............
array [var_1] = .......
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vanessa
Гость
« Ответ #4 : Май 03, 2011, 14:32 »

Может лучше emun использовать? Если я, конечно, правильно понял.
Код
C++ (Qt)
class RefTest
{
public:
 enum Var {var_0 = 0, var_1, ...., var_count}
public:
RefTest()
{}
private:
int array[var_count];
};
............
array [var_1] = .......
 

нет, хочется сдетать так
Код:
.....
var0=var1+var2;
....
согласитесь, это смотрится проще чем
Код:
.....
array[var_0]=array[var_1]+array[var_2];
....

но потом еще нужно сделать примерно такой метод
Код:
 int* RegTest::getValues() {return array;}
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Май 03, 2011, 14:35 »

Куча ссылок проще не смотрится.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Май 03, 2011, 14:53 »

нет, хочется сдетать так
Код:
.....
var0=var1+var2;
....
Сомнительное хотение попахивающее "кодированием". Видно что var0 и var1(2) неоднообразны, вероятно хранят разные данные. Если есть нужда иметь их также в виде массива, лучше так
Код
C++ (Qt)
#pragma pack(push, 4)
class RefTest {
public:
 union {
  int mArray[10];
  struct {
    int mSpeed;    // var0
    int mAccel;      // var1
    int mTime;
    ...
  };
 };
};
#pragma pack(pop)
 
Чтобы по-человечески написать напр
Код
C++ (Qt)
mSpeed += mAccel * mTime;
 
Записан
vanessa
Гость
« Ответ #7 : Май 03, 2011, 15:22 »

2 Igors
Согласен, Ваш вариан лучше чем тот, что я придумал. Спасибо за подсказку, но тогда есть вопрос: что это за директивы
#pragma pack(push, 4)
и
#pragma pack(pop)
Зачем они и какие ограничения они накладывают ? компилятор - gcc
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Май 03, 2011, 15:28 »

Это указывает выравнивание.
Не советую я использовать такой подход. Делай нормально.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Май 03, 2011, 15:35 »

#pragma pack(push, 4)
и
#pragma pack(pop)
Зачем они и какие ограничения они накладывают ? компилятор - gcc
Ну если все "только int" - то можно и без них, но вот др. случай
Код
C++ (Qt)
union {
int mArray[10];
struct {
 char mFlag;
 int mData;
};
};
 
Здесь уже без директивы выравнивания mData может находиться совсем не на том месте что mArray[1] (напр если выравнивание 2). То есть если хотите обращаться к данным "и так и сяк" - подчерните pack'ом
Записан
vanessa
Гость
« Ответ #10 : Май 03, 2011, 15:40 »

Это указывает выравнивание.
Не советую я использовать такой подход. Делай нормально.
нормально это так
Код:
array[var_0]=array[var_1]+array[var_2];
?
но это сильно усложнит мою программу. и тут дело даже не в усложнении как-таковом, это прога, она написана и оттестирована, но только на другом языке. Тепер ее нужно переписать на с++. но прога эта оперирует порядка несколькими сотнями переменных, причем там есть средства автоматического складывания этих переменных в массив. вот я и ищу элегантный способ определить несколько сот переменных в классе да еще так, чтоб они аккуратно лежали в массиве..... понравился вариант с ссылками но пугает страшная конструкция инициализации этих ссылок. Вариан что предложил Igors вроде свободен от этого недостатка но наверное у него тоже есть свои минусы........

Цитировать
Ну если все "только int" - то можно и без них, но вот др. случай
в пределах массива - все одного типа, но таких юнионов планируется четыре: bool, qint16, qint32 и double
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Май 03, 2011, 15:45 »

Код:
struct YouArray {
  int& var_0 () {return array [0];}
  int& var_1 () {return array [1];}

private:
  int array_ [10];
}
......
arr.var_0 () = arr.var_1 () + arr.var_2 ();
ИМХО, так лучше будет.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Май 03, 2011, 17:43 »

Код:
struct YouArray {
  int& var_0 () {return array [0];}
  int& var_1 () {return array [1];}

private:
  int array_ [10];
}
......
arr.var_0 () = arr.var_1 () + arr.var_2 ();
ИМХО, так лучше будет.
Ну если уж взялись делать "в стиле плюсов" - то определяйте и константные методы, а то у Вас вся константность класса накрывается медным тазом  Улыбающийся

. Вариан что предложил Igors вроде свободен от этого недостатка но наверное у него тоже есть свои минусы........
Улыбающийся Любая вещь имеет свои плюсы и минусы - это нормально. Членами union могут быть только POD (простые) типы, напр так нельзя
Код
C++ (Qt)
union {
MyClass mA;
};
 
А сама конструкция и #pragma pack 100% легальны (просто не очень популярны)

Записан
vanessa
Гость
« Ответ #13 : Май 03, 2011, 18:38 »

Цитировать
Любая вещь имеет свои плюсы и минусы - это нормально. Членами union могут быть только POD (простые) типы, напр так нельзя
Меня это полностью устраивает, мало того с самого начала была подобная мысль но я ее отвергнул потому как информация про то что юнионам и структурам можно не давать имен как-то прошла мимо меня, ну а писать длинные имена мне не хотелось....
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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