С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.65
larafyll
0 / 0 / 0
Регистрация: 11.10.2010
Сообщений: 5
#1

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

11.10.2010, 12:07. Просмотров 4910. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2010, 12:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Член-ссылка на другой член класса (C++):

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

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

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

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

Член класса управляемый не может относиться к типу класса неуправляемый - C++
Подскажите пожалуйста, что за ошибка "Член класса управляемый не может относиться к типу класса неуправляемый"? #include <vector> ...

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

12
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
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;
}
0
larafyll
0 / 0 / 0
Регистрация: 11.10.2010
Сообщений: 5
11.10.2010, 13:20  [ТС] #3
Цитата Сообщение от LineStown Посмотреть сообщение
А почему бы в программе не сделать обьект типа Dot2D и исапользовать эти же x,y. От названия полей класса как бы ничего не изменится
Меняется читабельность кода. Очень сильно меняется. Сравните window.width и window.x - смысловая нагрузка абсолютно разная.
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
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;
};
И читабельно и много места не кушает.
0
larafyll
0 / 0 / 0
Регистрация: 11.10.2010
Сообщений: 5
11.10.2010, 13:59  [ТС] #5
Цитата Сообщение от LineStown Посмотреть сообщение
Если рассматривать в таком ключе, то оптимальным вариантом будет 2 класса с 2-мя полями.
К сожалению, приведенный мною пример упрощен до максимума - в реальности функционал класса намого больше. Если бы создание еще одного класса было приемлимым решением - я бы не открыл эту тему.
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
11.10.2010, 14:43 #6
Цитата Сообщение от larafyll Посмотреть сообщение
К сожалению, приведенный мною пример упрощен до максимума - в реальности функционал класса намого больше. Если бы создание еще одного класса было приемлимым решением - я бы не открыл эту тему.
Что бы продумывать отпимизацию, нужно видеть что оптимизировать\
Как вариант использывать дял полей класса комбинированные имена, а обьекты создавать с нужными именами (пример widthX,heightY ну и т.д. получится window1.heightY, Dot1.widthX, и то и то читабельно)
1
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 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) {}
};
0
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 ;
}
1
ISergey
Maniac
Эксперт С++
1395 / 906 / 56
Регистрация: 02.01.2009
Сообщений: 2,706
Записей в блоге: 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;
};
Нее ?
0
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 Посмотреть сообщение
не меняет код
Имел в виду код скомпилированного файла.
0
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 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"
}
1
larafyll
0 / 0 / 0
Регистрация: 11.10.2010
Сообщений: 5
12.10.2010, 02:39  [ТС] #12
Цитата Сообщение от Nick Alte Посмотреть сообщение
К тому, что мы получаем несколько имён для одной переменной. Что, собственно, и требовалось. При этом ещё и экономим на ссылках и их инициализации.
*Ушел разбиратся с union'ами.. Спасибо.
0
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 , значит на их место просто подставится ссылка на х (ведь компилятор способен сделать такую простую подстановку).
1
12.01.2013, 22:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2013, 22:58
Привет! Вот еще темы с ответами:

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

Сам вопрос: почему функция-член одного класса не вызывается из функции-члена другого класса? - C++
//Щас всё объясню. Так, имеем два класса, в одном я определил функцию-член. Все конструкторы и прочее //опущены для уменьшения кода ...

нестатическая ссылка на член должна указываться относительного заданного объекта - C++
Подскажите что не так? (ошибка в конструкторе puckMan.cpp) gameElement.h #pragma once class gameElement { public: ...

нестатическая ссылка не член должна указываться относительно заданного объекта - C++
выдает очень много этих ошибок в коде. в строчках 93, 100, 102, 104, 105, 112, 118, 119, 124, 129, 135, 136 #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.