![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| gnick |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
Подскажите пожалуйста как в конструкторе класса присвоить значение переменной равное адрессу класса.
на делфи это выглядит так:
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Это сообщение отредактировал(а) Void - 9.5.2006, 18:33 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| gnick |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
С преобразованием типов не выходит:
error C2440: 'reinterpret_cast' : cannot convert from 'TClassA ^const ' to 'unsigned' a type representing an address in the gc heap can only be converted to integral type via pinning При этом преобразовывается тип моего класса в unsigned. А мне нужно просто сам адресс вызывающего конструктора. Что-то типа:
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
gnick, что ж ты сразу не сказал, что на C++/CLI пишешь. Это существенно менет дело.
В любом случае, это получается не адрес вызывающего конструктора, а адрес объекта. Объясни, зачем это нужно, так просто сказать нельзя. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| gnick |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
При создании екземпляра класса, один из его членов должен получить уникальное имя. Поскольку двух одинаковых адрессов не бывает, вот и решил присваивать имя через адресс конструктора.
|
|||
|
||||
| MAKCim |
|
||||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
наследование?
1.
2.
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||||
|
|||||||||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Во-первых, в C++ this - это указатель, поэтому запись:
Адрес конструктора для всех экземпляров одного и того же класса одинаковый. (Если, конечно, я правильно понимаю понятие "экземпляр класса"). Если тебе нужно уникальное значение для экземпляра класса (т.е. не общее для всех экземпляров одного и того же класса), то используй this - двух разных классов с одинаковым значением this не может существовать... Это сообщение отредактировал(а) bsa - 10.5.2006, 10:22 |
||||
|
|||||
| gnick |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
2MAKCim - спасибо за идею, но мне не нужно различать класс предка и наследника.
Мне нужно нечто похожее на:
Возвражает имя класса на который указывает this, в данном случае это будет "А" |
||||
|
|||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
gnick, может просто передавать имя в качестве параметра конструктора?
|
|||
|
||||
| gnick |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
у меня так и сделано. Но очень часто конкретное имя мне не важно, лишь бы оно было уникально. Можно конечно вести счетчик или рандомным генератором, но хотелось бы сделать именно через адрес указателя. |
|||
|
||||
| Ryn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 21.4.2006 Репутация: нет Всего: нет |
разве
A() { name = int(this); } не наботает ? вроде все норм. еще можно создать статическую переменную в классе, а конструкторе ее увеличивать и присваивать ее значение name ... static int id; int name; A() { id++; name = id; } ... адресс класса в делфи записывается по-другому )) Это сообщение отредактировал(а) Ryn - 10.5.2006, 12:34 |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
Если это не дело принципа, то имхо лучше использовать статическую переменную.
Например, вот так:
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
В таком случае об уникальности можно забыть. В C++/CLI объекты могут перемещаться GC и адрес их можнт изменяться в течение жизни объекта. Можно сделать так:
Это сообщение отредактировал(а) Void - 10.5.2006, 17:53 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
в каком смысле? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
gnick, тебе, наверное, нужно это:
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
bsa, если ты взглянешь немного выше по теме, то увидишь, что я уже предлагал схожий вариант. Человек пишет на C++/CLI, в котором указатель нельзя напрямую привести к целочисленному типу, текст ошибки был продемонстрирован.
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Void, к сожалению, я с C++/CLI не знаком (под Linux еще нет компилятора). Поэтому всех тонкостей не знаю.
Тогда имеет смысл завести статичный счетчик и увеличивать его в каждом конструкторе. |
|||
|
||||
| likehood |
|
|||
|
666 ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 21.12.2005 Репутация: 8 Всего: 24 |
||||
|
||||
| UnrealMan |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
А union там есть? Можно тогда вместо reinterpret_cast<unsigned>(this) попробовать сделать что-то вроде
Конечно, это не очень хорошо, но тоже как вариант... :-) Это сообщение отредактировал(а) UnrealMan - 11.5.2006, 08:08 |
||||||
|
|||||||
| UnrealMan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Хотя в данном случае всё гораздо проще:
:-) |
||||
|
|||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
UnrealMan, ну нет арифметики хэндлов (а this в managed классе имеет тип не T*, а T^) в C++/CLI.
Что-то автор темы потерялся, пора бы услышать его мнение -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| gnick |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 27.4.2006 Репутация: нет Всего: нет |
После изучения мат. части пришел к выводу про который писал Void:
В C++/CLI объекты могут перемещаться GC и адрес их можно изменяться в течение жизни объекта. Соответственно идея использовать адрес объекта в качестве уникального имени не жизнеспособен. Сделал так:
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |