Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
_stanislav
Рука
273 / 264 / 166
Регистрация: 16.08.2014
Сообщений: 1,248
Завершенные тесты: 2
#1

Как инициализировать this внутри класса - C++

29.10.2014, 13:25. Просмотров 632. Ответов 20
Метки нет (Все метки)

Доброго времени суток. Подскажите пожалуйста, как решить данную проблему.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct Test
{
    void F()
    {
        this = new Test; //Как инициализировать this внутри класса.
    }
};
 
int main(int argc, char* argv[])
{
    Test* p = 0;
    p->F();
 
    return EXIT_SUCCESS;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2014, 13:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как инициализировать this внутри класса (C++):

Друзья, подскажите, говорят, что можно поля класса инициализировать в момент объявления класса. Как это сделать?
Скажу сразу, а то сейчас начнется, что я прекрасно понимаю, что поля класса при...

Как инициализировать статические члены класса
Помогите пожалуйста....я не знаю как вывести в статическое поле значения((( ...

Как инициализировать строковой член класса?
Доброго времени. Подскажите, пожалуйста, как инициализировать строковую...

Как правильно инициализировать статические члены класса?
Я новичок и заранее прошу прощение за тупые вопросы. Имеются два класса:...

Как инициализировать члены класса, являющегося параметром шаблона
#include <iostream> #include <conio.h> using namespace std; template...

Как правильно инициализировать динамический массив пользовательского класса
Допустим есть класс: class A { public: A(); A(int a, int b, int c) {}...

20
quwy
Native x86
3333 / 2180 / 649
Регистрация: 13.02.2013
Сообщений: 7,239
29.10.2014, 13:29 #2
Цитата Сообщение от _stanislav Посмотреть сообщение
Подскажите пожалуйста, как решить данную проблему.
Использовать классы, а не структуры с методами?
0
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,211
Завершенные тесты: 3
29.10.2014, 13:33 #3
Что надо получить-то в итоге?
Цитата Сообщение от quwy Посмотреть сообщение
Использовать классы, а не структуры с методами?
"struct" объявляет класс, также как и "class".
1
_stanislav
Рука
273 / 264 / 166
Регистрация: 16.08.2014
Сообщений: 1,248
Завершенные тесты: 2
29.10.2014, 13:36  [ТС] #4
Суть не в классах или структурах, нужно инициализировать внешний пустой указатель внутри функции F();
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
29.10.2014, 13:38 #5
this нельзя присваивать и вообще за него отвечает неявный код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
 ...
};
A *p;
...
p=new A; // Здесь this и инициируется, причём, именно его new и возвращает.
...
delete p;
p=new A[...];//А здесь он инициируется отдельно для каждого элемента, оператор new возвращает this нулевого элемента, this каждого следующего элемента на sizeof(A) больше, чем this предыдущего.
 
A a;// И здесь this тоже инициируется значением &a
A b(a);// А здесь this инициируется значением &b
A c[..];// А здесь он инициируется отдельно для каждого элемента, c[0].this инициируется значением &c[0], this каждого следующего элемента на sizeof(A) больше, чем this предыдущего.
. А явно нельзя.

Добавлено через 29 секунд
Цитата Сообщение от _stanislav Посмотреть сообщение
Суть не в классах или структурах, нужно инициализировать внешний пустой указатель внутри функции F();
this не является внешним пустым указателем.
0
MrGluck
Модератор
Эксперт CЭксперт С++
8022 / 4865 / 1425
Регистрация: 29.11.2010
Сообщений: 13,248
29.10.2014, 13:44 #6
Я думаю, вы не до конца понимаете что хотите. Используйте для хранения указателя на структуру отдельное свойство внутри другого объекта или инициализируйте указатель явно.
0
_stanislav
Рука
273 / 264 / 166
Регистрация: 16.08.2014
Сообщений: 1,248
Завершенные тесты: 2
29.10.2014, 13:45  [ТС] #7
Как инициализировать указатель "p" в функции F(), что бы скрыть от пользователя его инициализацию.
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
29.10.2014, 13:50 #8
Цитата Сообщение от _stanislav Посмотреть сообщение
Как инициализировать указатель "p" в функции F(), что бы скрыть от пользователя его инициализацию.
Ни как. Для того, чтоб по указателю можно было вызвать функцию, он должен быть уже инициирован.
0
_stanislav
Рука
273 / 264 / 166
Регистрация: 16.08.2014
Сообщений: 1,248
Завершенные тесты: 2
29.10.2014, 13:52  [ТС] #9
Microsoft VS 10 позволяет вызвать функцию из под нулевого указателя.
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
29.10.2014, 13:55 #10
То есть Microsoft VS 10 - это нифига не c++? Функция или статическая, или вызывается для конкретного экземпляра. В первом случае указатель вообще не нужен, во втором он должен быть инициирован.
0
_stanislav
Рука
273 / 264 / 166
Регистрация: 16.08.2014
Сообщений: 1,248
Завершенные тесты: 2
29.10.2014, 13:58  [ТС] #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct Test
{
    void F()
    {
        
    }
};
 
int main(int argc, char* argv[])
{
    Test* p = 0;
    p->F();
 
    return EXIT_SUCCESS;
}
Такой код по стандарту работать должен?
0
HighPredator
5647 / 1964 / 716
Регистрация: 10.12.2010
Сообщений: 5,691
Записей в блоге: 3
29.10.2014, 14:00 #12
Цитата Сообщение от _stanislav Посмотреть сообщение
Microsoft VS 10 позволяет вызвать функцию из под нулевого указателя.
С++ вообще позволяет много чего. Вот это
Цитата Сообщение от _stanislav Посмотреть сообщение
Test* p = 0;
p->F();
вообще по стандарту undefined behaviour. Далее можно даже не размышлять.
0
0x10
2554 / 1734 / 285
Регистрация: 24.11.2012
Сообщений: 4,361
29.10.2014, 14:00 #13
Цитата Сообщение от _stanislav Посмотреть сообщение
Такой код по стандарту работать должен?
По здравому смыслу он вполне рабочий) До тех пор пока в функции не начинаются попытки разыменования this или пока эта функция невиртуальная.
0
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,211
Завершенные тесты: 3
29.10.2014, 14:12 #14
Лучший ответ Сообщение было отмечено _stanislav как решение

Решение

Такой код по стандарту может не компилироваться, так как EXIT_SUCCESS не объявлен. Работать, кажется, должен, но F ничего не знает о p и никак не может его изменить, если ты к этому ведёшь.

Добавлено через 41 секунду
Цитата Сообщение от HighPredator Посмотреть сообщение
вообще по стандарту undefined behaviour
Хм... Какой пункт?

Добавлено через 9 минут
А, туплю. Выражение же всё равно вычисляется...
Цитата Сообщение от C++11 5.2.5
The postfix expression before the dot or arrow is evaluated;64
...
64) If the class member access expression is evaluated, the subexpression evaluation happens even if the result is unnecessary to determine the value of the entire postfix expression, for example if the id-expression denotes a static member.
1
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
29.10.2014, 14:14 #15
Цитата Сообщение от HighPredator Посмотреть сообщение
вообще по стандарту undefined behaviour.
Точнее так: сообщение о на столько тупой гоге разрешено не реализовывать в угоду скорости.
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,438
Записей в блоге: 30
29.10.2014, 14:15 #16
Цитата Сообщение от _stanislav Посмотреть сообщение
Как инициализировать this внутри класса
Вопрос по смыслу не правильный. "this" - это параметр метода, а не поле класса
0
HighPredator
5647 / 1964 / 716
Регистрация: 10.12.2010
Сообщений: 5,691
Записей в блоге: 3
29.10.2014, 14:20 #17
Цитата Сообщение от Somebody Посмотреть сообщение
Какой пункт?
Это прямо написано в пояснениях к пунктам 3.10/2, 4.1/1. Разыменование указателя дает lvalue, которое должно ссылаться на объект/функцию (3.10/2). Вместе с тем, null указатель не ссылается на объект. Соответственно, ub.

Можно даже рассмотреть с другой точки: как вызов не статического метода объекта типа X не для объекта типа Х (или его прозводного) есть ub (§9.3.1/1).
Короче как ни крути.
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,438
Записей в блоге: 30
29.10.2014, 14:21 #18
На всякий случай пояснение на пальцах, что такое this: http://www.cyberforum.ru/c-beginners/thread36070-page2.html#post171884

Добавлено через 1 минуту
Цитата Сообщение от _stanislav Посмотреть сообщение
Такой код по стандарту работать должен?
По стандарту коллега написал, а по факту работать будет: http://www.cyberforum.ru/c-beginners/thread36070.html#post171823
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
29.10.2014, 14:23 #19
Цитата Сообщение от Evg Посмотреть сообщение
Вопрос по смыслу не правильный. "this" - это параметр метода, а не поле класса
Этот параметр зависит от того, на каком адресе создан объект. Так что не принципиально, выполняется ли в связи с этим самым this какой либо код в момент присваивания указателя. Значение параметра this и возвращаемое значение new равны. А кому не нравится, пусть расставит в посте #5 кавычки.
0
HighPredator
5647 / 1964 / 716
Регистрация: 10.12.2010
Сообщений: 5,691
Записей в блоге: 3
29.10.2014, 14:23 #20
О, кстати у алены ровно про это запись есть http://alenacpp.blogspot.ru/2010/05/blog-post_28.html
2
29.10.2014, 14:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2014, 14:23
Привет! Вот еще темы с решениями:

Как инициализировать элементы данных производного класса через базовый?
есть базовый клас у него есть производный(открытое наследование), как...

Наследование: Как мне определить любой из методов заданного класса внутри другого класса?
Добрый день, подскажите пожалуйста, что я делаю не так Есть файл Container.h...

Конструктор класса не дает инициализировать переменную класса
Привет. Вот такой вот класс. Когда пытаюсь в конструкторе присвоить name и...

Где инициализировать переменные класса?
Почему я не могу инициализировать переменную непосредственно в описании класса?...


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

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

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