Как привести к типу?
От: Аноним  
Дата: 03.02.08 06:26
Оценка:

#define PP_CAT(a,b) a##b
#define PP_CAT_(a,b) a##b

#define PP_STR(s) PP_STR_(s)
#define PP_STR_(s) #s


class CNamedTreePropertyBase
{
public:
    CNamedTreePropertyBase() : name(0), pParent_(0) {}
    CNamedTreePropertyBase(const TCHAR * const Name, 
        CNamedTreePropertyBase *pParent) : name(Name)
        , pParent_(pParent) {}

    const TCHAR *const name;
    virtual const TCHAR const *GetName() const = 0;
    CNamedTreePropertyBase *pParent_;
};


#define NAMED_PROP(Type, Var, InitialVal, pParentProp) \
class PP_CAT(tag, Var) : public CNamedTreePropertyBase \
{ \
public: \
    const TCHAR * const name; \
    Type value; \
    PP_CAT(tag, Var) () : name(PP_STR(Var)) \
    , value(InitialVal) \
    , CNamedTreePropertyBase(name, pParentProp) {} \
    const TCHAR const *GetName() const {return name;} \
} Var; \
//endmacro


struct A
{
    NAMED_PROP(std::string, prop, _T("some value"), 0);
    NAMED_PROP(std::string, child_prop, _T("some value"), &prop);
};


Сообщение компилятора:

error C2440: 'reinterpret_cast' : cannot convert from 'class A::tagprop A::*' to 'class CNamedTreePropertyBase *'
There is no context in which this conversion is possible


Какие могут быть причины не преобразовывать указатель на объект класса A в указатель на объект класса B? Это стандартное поведение?
Re: Как привести к типу?
От: Аноним  
Дата: 03.02.08 09:20
Оценка:
Ты бы привел пример без макросов что-ли...
Re[2]: Примерно то же, но без макросов. Как привести к типу?
От: Аноним  
Дата: 03.02.08 09:46
Оценка:
Здравствуйте, Аноним, Вы писали:

class Base
{
    Base(Base *) {}
};

struct A
{
    Base base;

    struct _tag_x : public Base
    {
        _tag_x() : Base(reinterpret_cast<Base *>(&base)) {}
    } x;

};


Компилятор выдает ошибку:

error C2440: 'reinterpret_cast' : cannot convert from 'class Base A::*' to 'class Base *' There is no context in which this conversion is possible

Как тут можно сделать приведение типа указателя?

Спасибо.
Re: Как привести к типу?
От: Аноним  
Дата: 03.02.08 09:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>

А>#define NAMED_PROP(Type, Var, InitialVal, pParentProp) \
А>} Var; \
А>//endmacro

А>


косая кстати лишняя, хоть и не ошибка это.
Re[3]: Примерно то же, но без макросов. Как привести к типу?
От: Programador  
Дата: 03.02.08 10:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>
А>class Base
А>{
А>    Base(Base *) {}
А>};

А>struct A
А>{
А>    Base base;

А>    struct _tag_x : public Base
А>    {
А>        _tag_x() : Base(reinterpret_cast<Base *>(&base)) {}
А>    } x;

А>};
А>

А какое отношение имеет одно к другому, можете даже считать так

class Base
{
    Base(Base *) {}
};


    Base base;

    struct _tag_x : public Base
    {
        _tag_x() : Base(&base) {}
    } x;
Re[4]: Примерно то же, но без макросов. Как привести к типу?
От: Аноним  
Дата: 03.02.08 10:05
Оценка:
Здравствуйте, Programador, Вы писали:

P>А какое отношение имеет одно к другому, можете даже считать так


Мне нужно, чтобы объекты создавались внутри другого обьекта. Иначе получаются неувязочки по именам обьектов.
Re[3]: Примерно то же, но без макросов. Как привести к типу?
От: Programador  
Дата: 03.02.08 10:06
Оценка:
Здравствуйте, Аноним, Вы писали:


struct Base
{
    Base(Base *) {}
};

struct A
{
    Base base;

    struct _tag_x : public Base
    {
        _tag_x() : Base(reinterpret_cast<Base *>(&base)) {}
    } x;

};

http://www.comeaucomputing.com/tryitout/

"ComeauTest.c", line 12: error: a nonstatic member reference must be relative to a
specific object
_tag_x() : Base(reinterpret_cast<Base *>(&base)) {}
Re[4]: Примерно то же, но без макросов. Как привести к типу?
От: Аноним  
Дата: 03.02.08 10:14
Оценка:
Здравствуйте, Programador, Вы писали:

P>http://www.comeaucomputing.com/tryitout/


P>"ComeauTest.c", line 12: error: a nonstatic member reference must be relative to a

P> specific object
P> _tag_x() : Base(reinterpret_cast<Base *>(&base)) {}

Как — нибудь можно это обойти?
Re[5]: Примерно то же, но без макросов. Как привести к типу?
От: Programador  
Дата: 03.02.08 10:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Programador, Вы писали:


P>>http://www.comeaucomputing.com/tryitout/


P>>"ComeauTest.c", line 12: error: a nonstatic member reference must be relative to a

P>> specific object
P>> _tag_x() : Base(reinterpret_cast<Base *>(&base)) {}

А>Как — нибудь можно это обойти?

Я не очень понимаю какого эффекта нужно достичь Скажем есть еще

struct B
{
    Base base;

   .........
};

Что от них нужно?
Re[5]: Примерно то же, но без макросов. Как привести к типу?
От: Аноним  
Дата: 03.02.08 10:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как — нибудь можно это обойти?


Ну, например так:

class Base
{
public:
    Base(Base *) {}
};

struct A
{
    Base base;
    struct _tag_x : public Base
    {
        _tag_x(Base *pBase) : Base(pBase) {}
    } x;
    A():x(&base)
    {
    }
};


Проблема твоя совсем не связана с преобразованиями типов...
Чтобы было понятно в чем проблема, попробуй представить, что должен делать компайлер,
если ты захочешь просто объявить переменную типа A::_tag_x
Поскольку это самый нормальный тип, только объявленный в контексте типа А,
то ты можешь делать так:
void foo()
{
  _tag_x x; // opsss...
}
Re[5]: Примерно то же, но без макросов. Как привести к типу?
От: Baburin S.S. Россия  
Дата: 03.02.08 10:43
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Как — нибудь можно это обойти?

Если только ошибку компиляции то легко
struct Base
{
    Base(Base *) {}
};

struct A
{
    static Base base;

    struct _tag_x : public Base
    {
        _tag_x() : Base(reinterpret_cast<Base *>(&base)) {}
    } x;

};


Только что дальше?
... << RSDN@Home 1.2.0 alpha rev. 0>>

Re[6]: Примерно то же, но без макросов. Как привести к типу?
От: Аноним  
Дата: 03.02.08 10:49
Оценка:
Здравствуйте, Programador, Вы писали:

P>Я не очень понимаю какого эффекта нужно достичь Скажем есть еще


Нужно обьявить серию вложенных классов(структур) со свойствами в виде структур, чтобы в каждом обьекте структуры лежал указатель на обьект другой структуры. То есть объявить и определить дерево в одном файле, так чтобы не возникало ошибок линкера о повторном определении объекта.
Re[6]: Примерно то же, но без макросов. Как привести к типу?
От: Аноним  
Дата: 03.02.08 11:02
Оценка:
Здравствуйте, Baburin S.S., Вы писали:

static не подойдет, если в классе B будет переменная типа std::string, или что нибудь в этом роде, то будут утечки памяти.
Re[7]: Примерно то же, но без макросов. Как привести к типу?
От: Programador  
Дата: 03.02.08 11:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Programador, Вы писали:


P>>Я не очень понимаю какого эффекта нужно достичь Скажем есть еще


А>Нужно обьявить серию вложенных классов(структур) со свойствами в виде структур, чтобы в каждом обьекте структуры лежал указатель на обьект другой структуры. То есть объявить и определить дерево в одном файле, так чтобы не возникало ошибок линкера о повторном определении объекта.

связать их указателями на базовый класс и в него поместиь GetName и т.п. как виртуальные?
Re[8]: Примерно то же, но без макросов. Как привести к типу?
От: Аноним  
Дата: 03.02.08 11:47
Оценка:
Здравствуйте, Programador, Вы писали:

P>связать их указателями на базовый класс и в него поместиь GetName и т.п. как виртуальные?

Да, этого и хотелось. Этого можно достичь без проблем, если использовать два макроса —
один типа DECLARE... в *.h — файле, а другой типа IMPLEMENT... — в *.cpp файле. В макросах, соответственно обьявляются и определяются объекты. Но может быть можно обойтись одним макросом в *.h файле? Пока что не знаю.
Re[3]: Примерно то же, но без макросов. Как привести к типу?
От: MasterZiv СССР  
Дата: 03.02.08 11:47
Оценка:
Аноним 834 пишет:
> *error C2440: 'reinterpret_cast' : cannot convert from 'class Base A::*'
> to 'class Base *' There is no context in which this conversion is possible*

И правильно делает. Вложенный класс ничего об охватывающем не знает.
Это вам не Java.
>
> Как тут можно сделать приведение типа указателя?

Если тебе нужен указатель на мембер, нужно его ПРОСТО ВЕРНУТЬ из какой-то
мембер-функции.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Примерно то же, но без макросов. Как привести к типу?
От: Аноним  
Дата: 03.02.08 11:55
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Если тебе нужен указатель на мембер, нужно его ПРОСТО ВЕРНУТЬ из какой-то

MZ>мембер-функции.

А через шаблоны можно такое реализовать? Так, чтобы можно было записать одним макросом?
Re: Как привести к типу?
От: rg45 СССР  
Дата: 03.02.08 12:15
Оценка:
А>Сообщение компилятора:

А>error C2440: 'reinterpret_cast' : cannot convert from 'class A::tagprop A::*' to 'class CNamedTreePropertyBase *'

А> There is no context in which this conversion is possible

А>Какие могут быть причины не преобразовывать указатель на объект класса A в указатель на объект класса B? Это стандартное поведение?


А ты почитай внимательно сообщение компилятора, тебе не кажется, странной выделенная конструкция? То, что ты пытаешься сделать, НЕ является приведением указателя одного типа к узазателю другого типа. Ты пытаешься привести указазатель-на-член-класса к указателю на объект класса. Указатели на члены классов — это совершенно особый тип указателей. Они не могут быть использованы как самостоятельные указатели, а только в применении к каким-то экземплярам классов. И заказанное тобой преобразование не под силу даже reinterpret_cast.
... << RSDN@Home 1.2.0 alpha rev. 787>>
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: Как привести к типу?
От: rg45 СССР  
Дата: 03.02.08 12:23
Оценка: +1
Здравствуйте, rg45, Вы писали:

А>>Сообщение компилятора:


А>>error C2440: 'reinterpret_cast' : cannot convert from 'class A::tagprop A::*' to 'class CNamedTreePropertyBase *'

А>> There is no context in which this conversion is possible

А>>Какие могут быть причины не преобразовывать указатель на объект класса A в указатель на объект класса B? Это стандартное поведение?


R>А ты почитай внимательно сообщение компилятора, тебе не кажется, странной выделенная конструкция? То, что ты пытаешься сделать, НЕ является приведением указателя одного типа к узазателю другого типа. Ты пытаешься привести указазатель-на-член-класса к указателю на объект класса. Указатели на члены классов — это совершенно особый тип указателей. Они не могут быть использованы как самостоятельные указатели, а только в применении к каким-то экземплярам классов. И заказанное тобой преобразование не под силу даже reinterpret_cast.


Другими словами, вот иллюстрация твоей ошибки в максимально упрощенном варианте:
struct A
{
  int x;
};
int* y = reinterpret_cast<int*>(&A::x);

error C2440: 'reinterpret_cast' : cannot convert from 'int A::* ' to 'int *'

... << RSDN@Home 1.2.0 alpha rev. 787>>
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: Как привести к типу?
От: Аноним  
Дата: 03.02.08 12:23
Оценка: :)
Здравствуйте, rg45, Вы писали:

R>А ты почитай внимательно сообщение компилятора, тебе не кажется, странной выделенная конструкция? То, что ты пытаешься сделать, НЕ является приведением указателя одного типа к узазателю другого типа. Ты пытаешься привести указазатель-на-член-класса к указателю на объект класса. Указатели на члены классов — это совершенно особый тип указателей. Они не могут быть использованы как самостоятельные указатели, а только в применении к каким-то экземплярам классов. И заказанное тобой преобразование не под силу даже reinterpret_cast.


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