Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/56: Рейтинг темы: голосов - 56, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 11.10.2010
Сообщений: 5

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

11.10.2010, 12:07. Показов 10495. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс 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 будет заменять лишние куски кода.
Есть идеи, как можно реализовать задуманное?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.10.2010, 12:07
Ответы с готовыми решениями:

Одномерные массивы. Найти максимальный член в массиве, начиная со второго член
Как найти максимальный член в массиве, начиная со второго члена?

В последовательности а1,...,a30 поменять местами наибольший член и член с номером m.
Даны натуральное число m, действительные числа а1,..,a30 (числа попарно различны). В последовательности а1,...,a30 поменять местами...

Поменять местами наибольший член последовательности и член с номером m
Помогите в 4 пункте меню сделать вывод на консоль, в файл и защиту если сразу выбрать 4 пункт. #include <stdio.h> #include...

12
 Аватар для LineStown
72 / 71 / 8
Регистрация: 04.08.2010
Сообщений: 434
11.10.2010, 12:34
А почему бы в программе не сделать обьект типа Dot2D и исапользовать эти же x,y. От названия полей класса как бы ничего не изменится

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
class Dot2D {
    int x;
    int y;
};
int main()
{
Dot2D d1,d2;
}
0
0 / 0 / 0
Регистрация: 11.10.2010
Сообщений: 5
11.10.2010, 13:20  [ТС]
Цитата Сообщение от LineStown Посмотреть сообщение
А почему бы в программе не сделать обьект типа Dot2D и исапользовать эти же x,y. От названия полей класса как бы ничего не изменится
Меняется читабельность кода. Очень сильно меняется. Сравните window.width и window.x - смысловая нагрузка абсолютно разная.
0
 Аватар для LineStown
72 / 71 / 8
Регистрация: 04.08.2010
Сообщений: 434
11.10.2010, 13:23
Цитата Сообщение от 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;
};
И читабельно и много места не кушает.
0
0 / 0 / 0
Регистрация: 11.10.2010
Сообщений: 5
11.10.2010, 13:59  [ТС]
Цитата Сообщение от LineStown Посмотреть сообщение
Если рассматривать в таком ключе, то оптимальным вариантом будет 2 класса с 2-мя полями.
К сожалению, приведенный мною пример упрощен до максимума - в реальности функционал класса намого больше. Если бы создание еще одного класса было приемлимым решением - я бы не открыл эту тему.
0
 Аватар для LineStown
72 / 71 / 8
Регистрация: 04.08.2010
Сообщений: 434
11.10.2010, 14:43
Цитата Сообщение от larafyll Посмотреть сообщение
К сожалению, приведенный мною пример упрощен до максимума - в реальности функционал класса намого больше. Если бы создание еще одного класса было приемлимым решением - я бы не открыл эту тему.
Что бы продумывать отпимизацию, нужно видеть что оптимизировать\
Как вариант использывать дял полей класса комбинированные имена, а обьекты создавать с нужными именами (пример widthX,heightY ну и т.д. получится window1.heightY, Dot1.widthX, и то и то читабельно)
1
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
11.10.2010, 18:38
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) {}
};
0
 Аватар для usernet009
26 / 26 / 5
Регистрация: 28.12.2009
Сообщений: 85
11.10.2010, 19:43
Может быть я что-то не понимаю но... ведь в конструкторе можно инициализировать ссылки, тобишь :
C++
1
2
3
4
5
6
7
class Dot2D {
    Dot2D () : & width = x, & height = y{};
    int x;
    int y;
    int & width ;
    int & height ;
}
1
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
11.10.2010, 20:14
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;
};
Нее ?
0
0 / 0 / 0
Регистрация: 11.10.2010
Сообщений: 5
11.10.2010, 20:50  [ТС]
Цитата Сообщение от 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 Посмотреть сообщение
не меняет код
Имел в виду код скомпилированного файла.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
11.10.2010, 22: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"
}
1
0 / 0 / 0
Регистрация: 11.10.2010
Сообщений: 5
12.10.2010, 02:39  [ТС]
Цитата Сообщение от Nick Alte Посмотреть сообщение
К тому, что мы получаем несколько имён для одной переменной. Что, собственно, и требовалось. При этом ещё и экономим на ссылках и их инициализации.
*Ушел разбиратся с union'ами.. Спасибо.
0
1 / 1 / 0
Регистрация: 06.04.2011
Сообщений: 9
12.01.2013, 22:58
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 , значит на их место просто подставится ссылка на х (ведь компилятор способен сделать такую простую подстановку).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.01.2013, 22:58
Помогаю со студенческими работами здесь

Создать рекурсивную функцию, определяющую n-ый член геометрической про* грессии, если известен первый член и знаменатель
Создать рекурсивную функцию, определяющую n-ый член геометрической про*грессии, если известен первый член и знаменатель прогрессии.(с...

Если объект константный, означает ли это, что ни один его член-элемент или член-метод не изменится?
Назрел такой вопрос: Если объект константный это означает, что ни один его член-элемент или член-метод не изменится или только некоторые из...

Член класса управляемый не может относиться к типу класса неуправляемый
Подскажите пожалуйста, что за ошибка &quot;Член класса управляемый не может относиться к типу класса неуправляемый&quot;? #include...

Реализовать подсчет количества объектов класса, используя статическую переменную-член класса
как реализовать подсчет количества объектов класса (используя статическую переменную-член класса), а также статическую функцию, которая...

Массив объектов класса как член другого класса
Здравствуйте. У меня тут возникла проблемка #include &quot;main.h&quot; class player { public: player(); player(char*); ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru