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

Указатели - C++

Восстановить пароль Регистрация
 
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
29.03.2014, 20:40     Указатели #1
Уважаемые форумчане, столкнулся с элементарной проблемой, но не могу понять как решить. Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<class T> struct S {
public:
    S(T t): val(t), elem(&t) {}
 
    T& get();
    T& set(T& n_v); // set new value (n_v) to the object S<T>;
    T* test() { return this->*elem;}
 
    T& operator[] (int n) { return elem[n]; }
private:
    T* elem;
    T val;
};
Проблема в том, что я не могу понять, почему при разыменовании с помощь вот этой функции
C++
1
T* test() { return this->*elem;}
мне возвращается адрес объекта, с которого вызывалась, а не разыменованное значение.
Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
29.03.2014, 20:41     Указатели #2
Цитата Сообщение от Sentipar Посмотреть сообщение
мне возвращается адрес объекта, с которого вызывалась.
а слово this что означает?
Георгий Фирсов
5 / 5 / 0
Регистрация: 05.11.2012
Сообщений: 62
29.03.2014, 20:46     Указатели #3
Пробуй так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<class T> struct S {
public:
    S(T t): val(t), elem(&t) {}
 
    T& get();
    T& set(T& n_v); // set new value (n_v) to the object S<T>;
    T test() { return this->*elem;}
 
    T& operator[] (int n) { return elem[n]; }
private:
    T* elem;
    T val;
};
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
29.03.2014, 20:54  [ТС]     Указатели #4
Добавлено через 1 минуту
Насколько я знаю, указатель на член объекта, с которого производился вызов функции (хотя там и без него можно написать, всё равно результат тот же)

Добавлено через 2 минуты
Не работает, так пробовал уже.
Георгий Фирсов
5 / 5 / 0
Регистрация: 05.11.2012
Сообщений: 62
29.03.2014, 21:02     Указатели #5
Кстати я сразу не заметил - у вас используется оператор
C++
1
->* // Да да и такой есть
Может поэтому и выдает неправильный результат
Можно попробовать
C++
1
T test() { return *elem;}
И вместо структуры использовать класс
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
29.03.2014, 21:18  [ТС]     Указатели #6
Хм, к этому я ещё не дошёл походу дела, но предполагалось что возвращаться будет разыменованный указатель.
Тогда какой код вместо этого написать?

Добавлено через 9 минут
К сожалению, это ничего не меняет. Очевидно где-то допустил ошибку, буду искать.

Добавлено через 3 минуты
Нашел.
C++
1
S(T t): val(t), elem(&val) {}
Очевидно, ссылаться нужно на данную-член самого объекта.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
29.03.2014, 21:29     Указатели #7
Цитата Сообщение от Sentipar Посмотреть сообщение
Насколько я знаю, указатель на член объекта, с которого производился вызов функции
почти
текущий объект, точнее указатель на текущий объект
тогда я не понимаю твой вопрос
Цитата Сообщение от Sentipar Посмотреть сообщение
мне возвращается адрес объекта, с которого вызывалась,
объясни по подробней
и пример как используешь класс что он выдает и что ожидаешь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2014, 21:51     Указатели
Еще ссылки по теме:

C++ Написать программу сортировки через указатели на указатели
Указатели и массивы. Указатели и функции C++
Указатели на массивы. Указатели и функции C++

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

Или воспользуйтесь поиском по форуму:
Sentipar
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 26
29.03.2014, 21:51  [ТС]     Указатели #8
Я уже решил проблему, но всё равно, спасибо, что напомнили об операторе this.
Проблема была в том, что я неправильно использовал оператор ->* (не зная при этом, что он делает), и ещё - ссылаться надо было на член самого объекта:
C++
1
S(T t): val(t), elem(&val) {}
К счастью, я уже разобрался. Спасибо за помощь.
Yandex
Объявления
29.03.2014, 21:51     Указатели
Ответ Создать тему
Опции темы

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