Форум программистов, компьютерный форум CyberForum.ru

Член-ссылка на другой член класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.65
larafyll
0 / 0 / 0
Регистрация: 11.10.2010
Сообщений: 5
11.10.2010, 12:07     Член-ссылка на другой член класса #1
Есть класс Dot с двумя членами - x и y. Требуется еще один класс, который хранит width i height, но реализация этого класса ничем не отличается от класса Dot - вся разница в именах 2-х членов. Поэтому было бы логично создать просто 2 ссылки на эти 2 поля. Я пытался создать следующую структуру:
C++
1
2
3
4
5
6
class Dot2D {
    int x;
    int y;
    // int & width = x;
    // int & height = y;
}
Однако синтаксис c++ не разрешает инициализировать члены класса при их описании, а ссылка не может быть инициализирована после описания.
#define width x будет заменять лишние куски кода.
Есть идеи, как можно реализовать задуманное?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2010, 12:07     Член-ссылка на другой член класса
Посмотрите здесь:

C++ Сам вопрос: почему функция-член одного класса не вызывается из функции-члена другого класса?
C++ Нестатическая ссылка не член должна указываться относительно заданного объекта
нестатическая ссылка на член должна указываться относительного заданного объекта C++
C++ Одномерные массивы. Найти максимальный член в массиве, начиная со второго член
В последовательности а1,...,a30 поменять местами наибольший член и член с номером m. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
11.10.2010, 12:34     Член-ссылка на другой член класса #2
А почему бы в программе не сделать обьект типа Dot2D и исапользовать эти же x,y. От названия полей класса как бы ничего не изменится

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
class Dot2D {
    int x;
    int y;
};
int main()
{
Dot2D d1,d2;
}
larafyll
0 / 0 / 0
Регистрация: 11.10.2010
Сообщений: 5
11.10.2010, 13:20  [ТС]     Член-ссылка на другой член класса #3
Цитата Сообщение от LineStown Посмотреть сообщение
А почему бы в программе не сделать обьект типа Dot2D и исапользовать эти же x,y. От названия полей класса как бы ничего не изменится
Меняется читабельность кода. Очень сильно меняется. Сравните window.width и window.x - смысловая нагрузка абсолютно разная.
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
11.10.2010, 13:23     Член-ссылка на другой член класса #4
Цитата Сообщение от larafyll Посмотреть сообщение
Меняется читабельность кода. Очень сильно меняется. Сравните window.width и window.x - смысловая нагрузка абсолютно разная.
Если рассматривать в таком ключе, то оптимальным вариантом будет 2 класса с 2-мя полями.
C++
1
2
3
4
5
6
7
8
9
10
class Dot2D
{
int x;
int y;
};
class windowX
{
int width;
int height;
};
И читабельно и много места не кушает.
larafyll
0 / 0 / 0
Регистрация: 11.10.2010
Сообщений: 5
11.10.2010, 13:59  [ТС]     Член-ссылка на другой член класса #5
Цитата Сообщение от LineStown Посмотреть сообщение
Если рассматривать в таком ключе, то оптимальным вариантом будет 2 класса с 2-мя полями.
К сожалению, приведенный мною пример упрощен до максимума - в реальности функционал класса намого больше. Если бы создание еще одного класса было приемлимым решением - я бы не открыл эту тему.
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
11.10.2010, 14:43     Член-ссылка на другой член класса #6
Цитата Сообщение от larafyll Посмотреть сообщение
К сожалению, приведенный мною пример упрощен до максимума - в реальности функционал класса намого больше. Если бы создание еще одного класса было приемлимым решением - я бы не открыл эту тему.
Что бы продумывать отпимизацию, нужно видеть что оптимизировать\
Как вариант использывать дял полей класса комбинированные имена, а обьекты создавать с нужными именами (пример widthX,heightY ну и т.д. получится window1.heightY, Dot1.widthX, и то и то читабельно)
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
11.10.2010, 18:38     Член-ссылка на другой член класса #7
C++
1
2
3
4
5
6
7
8
9
10
11
class AliasedMembers {
    union {int x; int width;};
    union {int y; int height;};
};
 
class ReferencedMembers {
    int x, y;
    int &width, &height;
public:
    ReferencedMembers(int X=0, int Y=0): x(X), y(Y), width(x), height(y) {}
};
usernet009
 Аватар для usernet009
24 / 24 / 1
Регистрация: 28.12.2009
Сообщений: 85
11.10.2010, 19:43     Член-ссылка на другой член класса #8
Может быть я что-то не понимаю но... ведь в конструкторе можно инициализировать ссылки, тобишь :
C++
1
2
3
4
5
6
7
class Dot2D {
    Dot2D () : & width = x, & height = y{};
    int x;
    int y;
    int & width ;
    int & height ;
}
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
11.10.2010, 20:14     Член-ссылка на другой член класса #9
C++
1
2
3
4
5
6
7
8
9
10
class Employee{
public:
    Employee(): x(0), y(0){ }
 
    int Width() { return x; }
    int Height(){ return y; }
private:
    int x;
    int y;
};
Нее ?
larafyll
0 / 0 / 0
Регистрация: 11.10.2010
Сообщений: 5
11.10.2010, 20:50  [ТС]     Член-ссылка на другой член класса #10
Цитата Сообщение от usernet009 Посмотреть сообщение
Может быть я что-то не понимаю но... ведь в конструкторе можно инициализировать ссылки, тобишь :
C++
1
2
3
4
5
6
7
class Dot2D {
    Dot2D () : & width = x, & height = y{};
    int x;
    int y;
    int & width ;
    int & height ;
}
Честно говоря, не знал, что такой вариант возможен. Думал, ссылки должны быть инициализированны прямо на месте, иначе и не получалось. Ваш вариант работает, если чуть-чуть подправить код:
C++
1
Dot2D () : width(x), height(y){};
@Nick Alte
К чему тут union'ы? Остальная часть кода рабочая, и судя по всему, именно то что мне требуется. Спасибо!

Добавлено через 21 минуту
Цитата Сообщение от ISergey Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
class Employee{
public:
    Employee(): x(0), y(0){ }
 
    int Width() { return x; }
    int Height(){ return y; }
private:
    int x;
    int y;
};
Нее ?
Мне не кажется логичным написание дополнительных геттеров-сеттеров. Добавление ссылки, насколько мне известно, не меняет код, в отличие от методов.

Добавлено через 12 минут
Цитата Сообщение от larafyll Посмотреть сообщение
не меняет код
Имел в виду код скомпилированного файла.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
11.10.2010, 22:11     Член-ссылка на другой член класса #11
К чему тут union'ы?
К тому, что мы получаем несколько имён для одной переменной. Что, собственно, и требовалось. При этом ещё и экономим на ссылках и их инициализации.
C++
1
2
3
4
5
6
7
8
9
10
11
12
class AliasedMembers {
public:
    union {int x; int width;};
    union {int y; int height;};
};
 
void Foo()
{
    AliasedMembers am;
    am.x = 7; am.height = 8;
    std::cout << am.width << am.y;  // напечатается "78"
}
larafyll
0 / 0 / 0
Регистрация: 11.10.2010
Сообщений: 5
12.10.2010, 02:39  [ТС]     Член-ссылка на другой член класса #12
Цитата Сообщение от Nick Alte Посмотреть сообщение
К тому, что мы получаем несколько имён для одной переменной. Что, собственно, и требовалось. При этом ещё и экономим на ссылках и их инициализации.
*Ушел разбиратся с union'ами.. Спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2013, 22:58     Член-ссылка на другой член класса
Еще ссылки по теме:

Массив объектов класса как член другого класса C++
Если объект константный, означает ли это, что ни один его член-элемент или член-метод не изменится? C++
C++ Поменять местами наибольший член последовательности и член с номером m

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ccccfr
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 9
12.01.2013, 22:58     Член-ссылка на другой член класса #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Dot2D {
    Dot2D () : width(x), height(y) {};
    int x;
    int y;
    int & width ;
    int & height ;
};
 
//!!!ТУТ ЕСТЬ ОПАСНОСТЬ
const Dot2D c;
c.x++;//нельзя т.к.  с - константа
c.width++; 
/*МОЖНО, т.к. константность объекта не запрещает использовать члены-ссылки для изменения того,
 на что они ссылаются (то на что ссылается ссылка, не есть часть объекта => константность 
 объекта на неё не распространяется. Если оказалось что эта ссылка ссылается на другой член, то
  это считается будто у нас есть просто ссылка на него и константность объекта тут не причем)
*/
По этом у я бы сделал так

C++
1
2
3
4
5
6
7
class Dot2D 
{
    int x;
    int y;
    int & width() { return x; } ; // не конст => для конст объекта вызвать нельзя
    int & height() { return y; } ; 
};
Такой, вроде, не должен быть менее оптимизированным, по сравнению с вариантом в начале сообщения.
Ведь, функции, определенные в определении класса, по умолчанию inline , значит на их место просто подставится ссылка на х (ведь компилятор способен сделать такую простую подстановку).
Yandex
Объявления
12.01.2013, 22:58     Член-ссылка на другой член класса
Ответ Создать тему
Опции темы

Текущее время: 20:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru