Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Значение переменной по адрессу конструкора 
:(
    Опции темы
gnick
Дата 9.5.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Подскажите пожалуйста как в конструкторе класса присвоить значение переменной равное адрессу класса. 
 на делфи это выглядит так:
 
Код

  FName := IntToStr(DWord(Self));    


 
PM MAIL   Вверх
Void
Дата 9.5.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Код
class A
{
    std::string name_;
public:
    A()
    {
        char buf[32];
        sprintf(buf, "%u", reinterpret_cast<unsigned>(this));
        // _snprintf(buf, 32, "%u", reinterpret_cast<unsigned>(this));
        name_ = buf;
    }
};
  

Это сообщение отредактировал(а) Void - 9.5.2006, 18:33


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
gnick
Дата 10.5.2006, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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. А мне нужно просто сам адресс вызывающего конструктора. Что-то типа:
Код

Name = this.ToString;  // код не правильный, не знаю как верно оформить идею 
 
PM MAIL   Вверх
Void
Дата 10.5.2006, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



gnick, что ж ты сразу не сказал, что на C++/CLI пишешь. Это существенно менет дело.
Цитата(gnick @  10.5.2006,  02:48 Найти цитируемый пост)
А мне нужно просто сам адресс вызывающего конструктора

В любом случае, это получается не адрес вызывающего конструктора, а адрес объекта.
Объясни, зачем это нужно, так просто сказать нельзя. 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
gnick
Дата 10.5.2006, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



При создании екземпляра класса, один из его членов должен получить уникальное имя. Поскольку двух одинаковых адрессов не бывает, вот и решил присваивать имя через адресс конструктора.   
PM MAIL   Вверх
MAKCim
Дата 10.5.2006, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Поскольку двух одинаковых адрессов не бывает

наследование?
Код

// в конструкторах A, B вывод this

class A {...};
class B: public A {...};

int main()
{
    B b;      // одинаковые адреса
    return 0;
}

Цитата

один из его членов должен получить уникальное имя

1.
Код

typeid(<class>).name();

2.
Код

class unique_ID
{
private:
    static long ID_;
public:
    unique_ID() {++ID_;}
    static long get_ID() {return ID_;}
};

long unique_ID::ID_=0;

class A: public unique_ID
{
private:
    std::string name_;
public:
    A()
    {
        long ID_=unique_ID::get_ID();
        // преобр. ID_ в строку
    }
};
 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 10.5.2006, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Во-первых, в C++ this - это указатель, поэтому запись:
Код
Name = this.ToString;
в корне не верная. Надо было писать:
Код
Name = this->ToString;
Это раз.
Адрес конструктора для всех экземпляров одного и того же класса одинаковый. (Если, конечно, я правильно понимаю понятие "экземпляр класса").
Если тебе нужно уникальное значение для экземпляра класса (т.е. не общее для всех экземпляров одного и того же класса), то используй this - двух разных классов с одинаковым значением this не может существовать... 

Это сообщение отредактировал(а) bsa - 10.5.2006, 10:22
PM   Вверх
gnick
Дата 10.5.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



2MAKCim - спасибо за идею, но мне не нужно различать класс предка и наследника. 
Мне нужно нечто похожее на:
Код

class A
{
public:
    int name;

    A()
    {
       name = int(this);    // на делфи это было бы name := DWord(Self);  
                                     // каждый раз когда будет вызываться конструктор у this будет новый адрес
                                     // но как правильно реализовать получение адреса я не знаю
    }
};


Код

  name = this->ToString; 

 Возвражает имя класса на который указывает this, в данном случае это будет "А" 
PM MAIL   Вверх
likehood
Дата 10.5.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



gnick, может просто передавать имя в качестве параметра конструктора? 
PM MAIL   Вверх
gnick
Дата 10.5.2006, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 27.4.2006

Репутация: нет
Всего: нет



Цитата(baronp @ 10.5.2006,  11:40)
gnick, может просто передавать имя в качестве параметра конструктора?

у меня так и сделано. Но очень часто конкретное имя мне не важно, лишь бы оно было уникально. Можно конечно вести счетчик или рандомным генератором, но хотелось бы сделать именно через адрес указателя.   
PM MAIL   Вверх
Ryn
Дата 10.5.2006, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 21.4.2006

Репутация: нет
Всего: нет



разве 
A()
{
  name = int(this);
}

не наботает ? вроде все норм.

еще можно создать статическую переменную в классе, а конструкторе ее увеличивать и присваивать ее значение name
...
static int         id;
          int        name;
          A()
          {
                    id++;
                    name = id;
          }
... 


адресс класса в делфи записывается по-другому )) 

Это сообщение отредактировал(а) Ryn - 10.5.2006, 12:34
PM MAIL   Вверх
likehood
Дата 10.5.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



Если это не дело принципа, то имхо лучше использовать статическую переменную.
Например, вот так:
Код

struct ID {
    static int current_id;
    int id;
    ID() { id = current_id++; }
};

int ID::current_id = 0;

class MyClass : virtual public ID { ... };
 
PM MAIL   Вверх
Void
Дата 10.5.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(gnick @  10.5.2006,  13:57 Найти цитируемый пост)
но хотелось бы сделать именно через адрес указателя.

В таком случае об уникальности можно забыть. В C++/CLI объекты могут перемещаться GC и адрес их можнт изменяться в течение жизни объекта. Можно сделать так:
Код
using namespace System;

ref class A
{
    String^ name_;
public:
    A()
    {
        // этот вариант не гарантирует уникальность, 
        // но во многих случаях его достаточно
        name_ = GetHashCode().ToString();
        // в случае строгого требования уникальности имени
        // name_ = Guid::NewGuid().ToString();
    }
    property String ^Name
    {
        String ^get() { return name_; }
    }
};

int main()
{
    A ^obj = gcnew A;
    Console::WriteLine(obj->Name);
}
  

Это сообщение отредактировал(а) Void - 10.5.2006, 17:53


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
MAKCim
Дата 10.5.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

2MAKCim - спасибо за идею, но мне не нужно различать класс предка и наследника. 

в каком смысле? 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 10.5.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



gnick, тебе, наверное, нужно это:
Код
class A {
    private:
         long name;
    public:
         A() {
               name = (long)this;
         }
}
 
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1162 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.