Russian Qt Forum

Программирование => С/C++ => Тема начата: vanessa от Май 03, 2011, 13:59



Название: классы&ссылки
Отправлено: 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;
};

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

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



Название: Re: классы&ссылки
Отправлено: Пантер от Май 03, 2011, 14:05
Что-то оно ужасно выглядит и профита я не вижу.


Название: Re: классы&ссылки
Отправлено: RedDog от Май 03, 2011, 14:15
Мне почему то всегда казалось, что член класса не может быть ссылкой


Название: Re: классы&ссылки
Отправлено: Пантер от Май 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] = .......
 


Название: Re: классы&ссылки
Отправлено: vanessa от Май 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;}


Название: Re: классы&ссылки
Отправлено: Пантер от Май 03, 2011, 14:35
Куча ссылок проще не смотрится.


Название: Re: классы&ссылки
Отправлено: Igors от Май 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;
 


Название: Re: классы&ссылки
Отправлено: vanessa от Май 03, 2011, 15:22
2 Igors
Согласен, Ваш вариан лучше чем тот, что я придумал. Спасибо за подсказку, но тогда есть вопрос: что это за директивы
#pragma pack(push, 4)
и
#pragma pack(pop)
Зачем они и какие ограничения они накладывают ? компилятор - gcc


Название: Re: классы&ссылки
Отправлено: Пантер от Май 03, 2011, 15:28
Это указывает выравнивание.
Не советую я использовать такой подход. Делай нормально.


Название: Re: классы&ссылки
Отправлено: Igors от Май 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'ом


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

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


Название: Re: классы&ссылки
Отправлено: Пантер от Май 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 ();
ИМХО, так лучше будет.


Название: Re: классы&ссылки
Отправлено: Igors от Май 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% легальны (просто не очень популярны)



Название: Re: классы&ссылки
Отправлено: vanessa от Май 03, 2011, 18:38
Цитировать
Любая вещь имеет свои плюсы и минусы - это нормально. Членами union могут быть только POD (простые) типы, напр так нельзя
Меня это полностью устраивает, мало того с самого начала была подобная мысль но я ее отвергнул потому как информация про то что юнионам и структурам можно не давать имен как-то прошла мимо меня, ну а писать длинные имена мне не хотелось....