powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Получение ссылки на экземпляр класса...
12 сообщений из 12, страница 1 из 1
Получение ссылки на экземпляр класса...
    #39723118
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MS VS 2017 (CE).
Добрый день. Попался код, в котором в цикле заполняется массив указателей на объекты типа MyClass:
Класс MyClass:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class MyClass
{
public:
	MyClass(параметры) {
		// Код конструктора ...
	}	
// Другие члены класса ...
};


Заполнение массива указателей:
Код: plaintext
1.
2.
3.
4.
5.
6.
	int n = 10;
	MyClass ** mc = new MyClass *[n];
	for (int i = 0; i < n; i++) {
                // Формирование параметров для конструктора 
		mc[i] = &MyClass(параметры);
	}


При работе выяснилось, что после выхода из цикла for(), массив mc заполнен одинаковыми значениями: указателями на экземпляр класса, значения полей которого соответствует последней итерации цикла for().
Посмотрел в отладчике, что в цикле for() всякий раз вызывается конструктор MyClass(параметры), но значение this в нем одно и то же.
"Проблема" решилась после замены
Код: plaintext
1.
		mc[i] = &MyClass(параметры);


на
Код: plaintext
1.
		mc[i] = new MyClass(параметры);



Однако, остался вопрос насчет поведения поведения в случае исходного варианта:
Код: plaintext
1.
		mc[i] = &MyClass(параметры);


Поясните, пожалуйста - что происходит, отчего каждый раз создается экземпляр класса по одному и тому же адресу.
Спасибо.
...
Рейтинг: 0 / 0
Получение ссылки на экземпляр класса...
    #39723128
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
экземпляр MyClass создается на стеке и живет ровно одну итерацию for, после чего представляет из себя мусор
...
Рейтинг: 0 / 0
Получение ссылки на экземпляр класса...
    #39723143
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumэкземпляр MyClass создается на стеке...
Спасибо, а из чего сие следует?
...
Рейтинг: 0 / 0
Получение ссылки на экземпляр класса...
    #39723154
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumэкземпляр MyClass создается на стеке и живет ровно одну итерацию for, после чего представляет из себя мусор
он живет до выхода из блока {}

но это единственный экземпляр, так что вполне логично получить N одинаковых указателей
...
Рейтинг: 0 / 0
Получение ссылки на экземпляр класса...
    #39723155
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эквивалентный код
Код: plaintext
1.
2.
3.
4.
5.
for (int i = 0; i < n; i++) {
                // Формирование параметров для конструктора 
    MyClass ekz(параметры);
    mc[i] = &ekz;
}



наверно, технически на разных итерациях это разные ekz, но они будут как братья и на одном адресе стека
...
Рейтинг: 0 / 0
Получение ссылки на экземпляр класса...
    #39723156
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и по выходу из for() уничтожатся, так что потом там будет мусор, указатели на стек протухнут
...
Рейтинг: 0 / 0
Получение ссылки на экземпляр класса...
    #39723157
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglCerebrumэкземпляр MyClass создается на стеке и живет ровно одну итерацию for, после чего представляет из себя мусор
он живет до выхода из блока {}

но это единственный экземпляр, так что вполне логично получить N одинаковых указателей
Конструкция
Код: plaintext
1.
= &MyClass(параметры); 


- возвращает ссылку на экземпляр, созданный именно на стеке? Что-то никак не припомню, где про место выделения памяти для такой формы написано.
Подскажите, где про это можно подробнее почитать.
...
Рейтинг: 0 / 0
Получение ссылки на экземпляр класса...
    #39723170
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасия- возвращает ссылку на экземпляр, созданный именно на стеке? Что-то никак не припомню, где про место выделения памяти для такой формы написано.
Подскажите, где про это можно подробнее почитать.

Ты выделил память на массив указателей, потом разименовал каждый и присвоил им адрес созданного на стеке объекта.

Код: plaintext
1.
MyClass* ptr = &MyClass(....);


ссылка это
Код: plaintext
1.
MyClass& ref = ....


а операция & в твоем случае тебе возвращает адрес только что созданного в итерации MyClass-объекта, а не ссылку на него

ты просто перепутал место &
...
Рейтинг: 0 / 0
Получение ссылки на экземпляр класса...
    #39723180
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фишка тут в том, что язык позволяет создавать объекты не присваивая им имен.
Например, если тебе надо вызвать функцию с параметром MyClass
Код: plaintext
1.
2.
3.
4.
5.
void foo(MyClass x);

// то можно сделать так
MyClass x(/*параметры*/);
foo(x);


но ты вправе сделать и так
Код: plaintext
1.
foo(MyClass(/*параметры*/));


это тоже самое что и в первом случае за тем лишь исключением, что ты больше нигде в коде после foo НЕ сможешь обратиться к созданному экземпляру MyClass. Он будет уничтожен сразу же после того, как foo вернет управление.

В твоем коде ты создал такой экземпляр MyClass и тут же получил его адрес c помошью &

твой код равносилен такому
Код: plaintext
1.
2.
MyClass x(/*параметры*/);
m[i] = &x;


исходя из того, что я написал выше про создание объектов без имени - выкини x и замени его MyClass и получишь в точности что у тебя
...
Рейтинг: 0 / 0
Получение ссылки на экземпляр класса...
    #39723221
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum,

ОК, спасибо.
зы: вспомнил, где я все же читал про такое: в пиимерах к описанию конструкторов копирования!
...
Рейтинг: 0 / 0
Получение ссылки на экземпляр класса...
    #39723276
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ночь не спал, думал не ошибся ли я - нет
http://tpcg.io/KHNZmi


PS. Добрый gcc не дает выстрелить в ногу - error: taking address of temporary [-fpermissive]
...
Рейтинг: 0 / 0
Получение ссылки на экземпляр класса...
    #39723277
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в Project/Compile options надо дописать -fpermissive
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Получение ссылки на экземпляр класса...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]