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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оператор для указателя 
:(
    Опции темы
Neitron
Дата 16.12.2005, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно ли как-нибудь определить оператор для указателя?
Не помню в Страуструпе встречалось ли такое или нет.


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
A.V.N.
Дата 16.12.2005, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Neitron @ 16.12.2005, 09:23)
Можно ли как-нибудь определить оператор для указателя?
Не помню в Страуструпе встречалось ли такое или нет.


Код

class SubClass
{
  public:
    void method (void) { /* ... */ }
};

class A
{
  protected:
    SubClass B;
  public:
    SubClass* operator -> (void)  { return &B; }   
};

// ...

A->method ();
 

PM MAIL   Вверх
Neitron
Дата 16.12.2005, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нет я имел ввиду совсем другое.
Это я знаю прекрасно.

Ниже примерно то, что я спрашиваю.
Код

class A{
//skip
};
/* Вот эту ф-цию я хочу */
operator int( A *const)
{
 return 10; //например
}

int main()
{
   A * a;
   int i = a; // Вот это хочу.
   return 0;
}


Это сообщение отредактировал(а) Neitron - 16.12.2005, 13:32


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
chaos
Дата 16.12.2005, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



можно
PM WWW   Вверх
Neitron
Дата 16.12.2005, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тогда собсно, что в коде не правильно....
У меня билдер на строчку с определением ф-ции ругается...
Цитата

[C++ Error] Unit1.cpp(6): E2239 'typedef(A * const)' must be a member function



--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
chaos
Дата 16.12.2005, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



че там у тебя не правельно, разбираться не хочется smile но вот тебе пример набросал(если я тебя конечно правельно понял)
Код

#include <string.h>
#include <stdio.h>
#include <stdlib.h>


class CMyString
{
    char *m_lpszStr;
public:
    CMyString(const char *c_lpszStr)
    {
        unsigned int uiLen = strlen(c_lpszStr);
        m_lpszStr = new char[uiLen + 1];
        m_lpszStr[uiLen] = '\0';
        strncpy(m_lpszStr, c_lpszStr, uiLen);
    }

    virtual ~CMyString()
    { delete[] m_lpszStr; }

    inline void PrintStr() const
    { printf("%s\n", m_lpszStr); }

    operator int() const
    { return atoi(m_lpszStr); }
};

void main()
{
    CMyString test("123456");
    test.PrintStr();
    int a = test; //Вот то что ты хочешь
    printf("%d\n", a);
}



Это сообщение отредактировал(а) chaos - 16.12.2005, 13:44
PM WWW   Вверх
_hunter
Дата 16.12.2005, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



тут A:: перед оператором не хватает, но мой билдер и такое не принимает...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Neitron
Дата 16.12.2005, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не не не....
Эт я все знаю... Я же прошу об операторе для укзателя...
В твоем случае это будет так


Код

void main()
{
    CMyString  * test = new CMyString("123456");
    test.PrintStr();
    int a = test; // вот что я хочу., преобразование УКАЗАТЕЛЯ:), без разыменования объекта..
    printf("%d\n", a);
}

Добавлено @ 13:46
Цитата(_hunter @ 16.12.2005, 13:42)
тут A:: перед оператором не хватает, но мой билдер и такое не принимает...

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

Это сообщение отредактировал(а) Neitron - 16.12.2005, 13:45


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
_hunter
Дата 16.12.2005, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



Цитата
Тогда придется разыменовывать объект....

а в чем проблема?
и почему так:
int tmp = (int)a;
написать нельзя?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Mayk
Дата 16.12.2005, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



А ты уверен что оно тебе надо?
Для примера ф-ция CreateThread создает поток и передает ему dword.
В win32 размер dword'а и указателя на объект обычно совпадают, поэтому можно делать типа CreateThread(threadMain, ..., (DWORD)(ptr));
А если ты попытаешься передать таким способом, то результат будет плачевным ... или ты [un]box'ингом и занимаешься?

ЗЫ. Как вариант - сделай int A::operator&(); и используй ссылки, а не указатели.

Это сообщение отредактировал(а) Mayk - 16.12.2005, 13:50


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Neitron
Дата 16.12.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нееееееееееееее=))) Мне адрес совсем узнавать не нужно... Вы читайте же вопрос внимательноsmile
Вопрос, был ни как собсвенно узнать адрес, а можно ли вообще опеределить оператор для указателя.
Примерно такое....

В моем случае вообще AnsiString нужин...

Код

struct A{
   AnsiString Str;
};
struct B{
  A a;
};
struct C{
   B b;
};

operator AnsiString (C *const c)
{
    return c->b->a->Str;
}
int main()
{
   C * c = new C();
   AnsiString Str = c; 
}


Это сообщение отредактировал(а) Neitron - 16.12.2005, 14:08


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
chaos
Дата 16.12.2005, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



Neitron да вы извращенец батенька smile
Добавлено @ 14:13
а че так тоже не подходит
Код

CMyString *test = new CMyString("654321");
int a = CMyString(test);
delete test;

PM WWW   Вверх
Neitron
Дата 16.12.2005, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Видимо да)
Цитата

а че так тоже не подходит

Потому что я не спрашиваю как мне решить задачу, в программе которую я создаю.
Мне не нужны альтернативные пути. Как решать свои задачи, я вполне нахожу способы.
Я спрашиваю о тонкостях языка программирования, и о еще большей гибкости. И как уже понел, С++ это сделать слабо.
Добавлено @ 14:19
В моем случае я вполне обхожусь сейчас так.

Код

struct A{
   AnsiString Str;
};
struct B{
  A * a;
};
struct C{
   B * b;
   operator AnsiString()
   {
        return b->a->Str;
   } 
};
int main()
{
   C * c = new C();
   AnsiString Str = *c; 
}



Это сообщение отредактировал(а) Neitron - 16.12.2005, 14:17


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
chaos
Дата 16.12.2005, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



а может такое тебя успокоит, и ты поверишь в С++ smile
Код

#include <string.h>
#include <stdio.h>
#include <stdlib.h>


class CMyString
{
protected:
    char *m_lpszStr;
public:
    CMyString() {}
    CMyString(const char *c_lpszStr)
    {
        unsigned int uiLen = strlen(c_lpszStr);
        m_lpszStr = new char[uiLen + 1];
        m_lpszStr[uiLen] = '\0';
        strncpy(m_lpszStr, c_lpszStr, uiLen);
    }
    
    CMyString(const CMyString *c_opStr)
    {
        unsigned int uiLen = strlen(c_opStr->m_lpszStr);
        m_lpszStr = new char[uiLen + 1];
        m_lpszStr[uiLen] = '\0';
        strncpy(m_lpszStr, c_opStr->m_lpszStr, uiLen);
    }

    virtual ~CMyString()
    { delete[] m_lpszStr; }

    inline void PrintStr() const
    { printf("%s\n", m_lpszStr); }

    operator int() const
    { return atoi(m_lpszStr); }
};

class A : public CMyString
{
public:
    A(const char *c_lpszStr): CMyString(c_lpszStr)
    {}
};

class B : public A
{
public:
    B(const char *c_lpszStr): A(c_lpszStr)
    {}
};

void main()
{

    B *test2 = new B("654321");
    CMyString test = test2;
    delete test2;

    int a = test;
    printf("%d\n", a);
    
}



Это сообщение отредактировал(а) chaos - 16.12.2005, 14:45
PM WWW   Вверх
Neitron
Дата 16.12.2005, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну не то, это все не то...
И это намного длинее чем у меня сделано.

Зачем это все и создовать дополнительные переменные?
Когда можно вот так.
Код

    B *test2 = new B("654321");
    int a = *test2;
    printf("%d\n", a);
    delete test2;

В С++ я верю, я это едисвенный язык который мне максимально нравится.


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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