Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1

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

29.10.2014, 13:25. Показов 2559. Ответов 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.10.2014, 13:25
Ответы с готовыми решениями:

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

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

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

20
Native x86
Эксперт Hardware
 Аватар для quwy
6858 / 3791 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
29.10.2014, 13:29
Цитата Сообщение от _stanislav Посмотреть сообщение
Подскажите пожалуйста, как решить данную проблему.
Использовать классы, а не структуры с методами?
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
29.10.2014, 13:33
Что надо получить-то в итоге?
Цитата Сообщение от quwy Посмотреть сообщение
Использовать классы, а не структуры с методами?
"struct" объявляет класс, также как и "class".
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
29.10.2014, 13:36  [ТС]
Суть не в классах или структурах, нужно инициализировать внешний пустой указатель внутри функции F();
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.10.2014, 13:38
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
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
29.10.2014, 13:44
Я думаю, вы не до конца понимаете что хотите. Используйте для хранения указателя на структуру отдельное свойство внутри другого объекта или инициализируйте указатель явно.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
29.10.2014, 13:45  [ТС]
Как инициализировать указатель "p" в функции F(), что бы скрыть от пользователя его инициализацию.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.10.2014, 13:50
Цитата Сообщение от _stanislav Посмотреть сообщение
Как инициализировать указатель "p" в функции F(), что бы скрыть от пользователя его инициализацию.
Ни как. Для того, чтоб по указателю можно было вызвать функцию, он должен быть уже инициирован.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
29.10.2014, 13:52  [ТС]
Microsoft VS 10 позволяет вызвать функцию из под нулевого указателя.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.10.2014, 13:55
То есть Microsoft VS 10 - это нифига не c++? Функция или статическая, или вызывается для конкретного экземпляра. В первом случае указатель вообще не нужен, во втором он должен быть инициирован.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
29.10.2014, 13:58  [ТС]
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
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
29.10.2014, 14:00
Цитата Сообщение от _stanislav Посмотреть сообщение
Microsoft VS 10 позволяет вызвать функцию из под нулевого указателя.
С++ вообще позволяет много чего. Вот это
Цитата Сообщение от _stanislav Посмотреть сообщение
Test* p = 0;
p->F();
вообще по стандарту undefined behaviour. Далее можно даже не размышлять.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
29.10.2014, 14:00
Цитата Сообщение от _stanislav Посмотреть сообщение
Такой код по стандарту работать должен?
По здравому смыслу он вполне рабочий) До тех пор пока в функции не начинаются попытки разыменования this или пока эта функция невиртуальная.
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
29.10.2014, 14:12
Лучший ответ Сообщение было отмечено _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
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.10.2014, 14:14
Цитата Сообщение от HighPredator Посмотреть сообщение
вообще по стандарту undefined behaviour.
Точнее так: сообщение о на столько тупой гоге разрешено не реализовывать в угоду скорости.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.10.2014, 14:15
Цитата Сообщение от _stanislav Посмотреть сообщение
Как инициализировать this внутри класса
Вопрос по смыслу не правильный. "this" - это параметр метода, а не поле класса
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
29.10.2014, 14:20
Цитата Сообщение от Somebody Посмотреть сообщение
Какой пункт?
Это прямо написано в пояснениях к пунктам 3.10/2, 4.1/1. Разыменование указателя дает lvalue, которое должно ссылаться на объект/функцию (3.10/2). Вместе с тем, null указатель не ссылается на объект. Соответственно, ub.

Можно даже рассмотреть с другой точки: как вызов не статического метода объекта типа X не для объекта типа Х (или его прозводного) есть ub (§9.3.1/1).
Короче как ни крути.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.10.2014, 14:21
На всякий случай пояснение на пальцах, что такое this: После компиляции VS2008 падает после удаления узла дерева, имеющего потомка

Добавлено через 1 минуту
Цитата Сообщение от _stanislav Посмотреть сообщение
Такой код по стандарту работать должен?
По стандарту коллега написал, а по факту работать будет: После компиляции VS2008 падает после удаления узла дерева, имеющего потомка
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.10.2014, 14:23
Цитата Сообщение от Evg Посмотреть сообщение
Вопрос по смыслу не правильный. "this" - это параметр метода, а не поле класса
Этот параметр зависит от того, на каком адресе создан объект. Так что не принципиально, выполняется ли в связи с этим самым this какой либо код в момент присваивания указателя. Значение параметра this и возвращаемое значение new равны. А кому не нравится, пусть расставит в посте #5 кавычки.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
29.10.2014, 14:23
О, кстати у алены ровно про это запись есть http://alenacpp.blogspot.ru/20... st_28.html
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.10.2014, 14:23
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru