Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Оператор для указателя


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

Автор: A.V.N. 16.12.2005, 12:54
Цитата(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 ();
 

Автор: Neitron 16.12.2005, 13:12
Нет я имел ввиду совсем другое.
Это я знаю прекрасно.

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

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

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

Автор: chaos 16.12.2005, 13:16
можно

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

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

Автор: chaos 16.12.2005, 13:40
че там у тебя не правельно, разбираться не хочется 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);
}


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

Автор: Neitron 16.12.2005, 13:43
Не не не....
Эт я все знаю... Я же прошу об операторе для укзателя...
В твоем случае это будет так


Код

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:: перед оператором не хватает, но мой билдер и такое не принимает...

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

Автор: _hunter 16.12.2005, 13:49
Цитата
Тогда придется разыменовывать объект....

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

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

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

Автор: Neitron 16.12.2005, 13:54
Нееееееееееееее=))) Мне адрес совсем узнавать не нужно... Вы читайте же вопрос внимательно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; 
}

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

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

Автор: Neitron 16.12.2005, 14:15
Видимо да)
Цитата

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

Потому что я не спрашиваю как мне решить задачу, в программе которую я создаю.
Мне не нужны альтернативные пути. Как решать свои задачи, я вполне нахожу способы.
Я спрашиваю о тонкостях языка программирования, и о еще большей гибкости. И как уже понел, С++ это сделать слабо.
Добавлено @ 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; 
}


Автор: chaos 16.12.2005, 14:40
а может такое тебя успокоит, и ты поверишь в С++ 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);
    
}


Автор: Neitron 16.12.2005, 14:49
ну не то, это все не то...
И это намного длинее чем у меня сделано.

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

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

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

Автор: chaos 16.12.2005, 14:54
Цитата(Neitron @ 16.12.2005, 14:49)
Зачем это все и создовать дополнительные переменные?

тогда "ни придется" ни чего разыменовывать

Автор: pablo 16.12.2005, 15:18
Если я правельно понял вопросс что может было бы разумно перегрузить оператор "->", перегружается как и все остальные операторы.

Автор: Neitron 16.12.2005, 16:28
pablo
Зачем мне его перегружать?
Цитата

тогда "ни придется" ни чего разыменовывать

Проблема не в том что я не хочу разыменовывать, а в том что я хочу, создать оператор для указателя.

Автор: pablo 16.12.2005, 17:41
Насколько я знаю, в С++ запрещено создание своих операторов

Автор: Earnest 16.12.2005, 18:38
Насколько я поняла, ты хочешь перегрузить оператор приведения типа для указателя на конкретный класс? Не выйдет.
Указатель (на что угодно) является базовым типом.
А написать свой оператор приведения можно только в классе.
Только класс-обертка может помочь, вроде вышеприведеного MyString, но написать как ты хочешь все равно будет нельзя.
Ты лучше подумай о другом: не за краткостью кода надо гнаться, а за ясностью.

Если в коде сплошь и рядом указатели будут присваиваться интам, через полгода сам голову сломаешь, вспоминая, что ты хотел этим сказать.

Автор: Neitron 16.12.2005, 18:49
Цитата

Насколько я знаю, в С++ запрещено создание своих операторов

Я не хочу создать свой оператор.

Earnest smile Впринципе да...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)