pClass1 = (Class1 *) pBase-> следующий без (Class1 *) приведения - PullRequest
1 голос
/ 18 февраля 2010

класс Base { База * следующая; }

class Class1 : Base
{
}

Base* pBase = new Base();
Class1* pTest = new Class1();
pBase->next = pTest;

Class1* pClass1;
pClass1 = (Class1*)pBase->next;

Я хочу писать

pClass1 = pBase->next;

и не получает ошибку компиляции C2440 (не может конвертировать). Или, другими словами, я хочу, чтобы pClass1 указывал на класс, на который указывает pBase-> next.

Возможно ли это с некоторой перегрузкой оператора? Как это сделать?

Ответы [ 3 ]

2 голосов
/ 18 февраля 2010
template<class T>
class Base 
{ 
   T* next; 
} 

class Class1 : Base<Class1> 
{ 
} 

Class1* pTest1 = new Class1(); 
Class1* pTest2 = new Class1(); 
pTest1->next = pTest2;

Class1* pClass1; 
pClass1 = pTest1->next; 
1 голос
/ 18 февраля 2010

Самое близкое, что я могу получить к тому, что вы ищете, это:

class Class1;

class Base
{
public:
    Base* next;

    operator Class1*()
    {
        return (Class1*)this;
    }
};

class Class1 : public Base
{
};

и

Base* pBase = new Base();
Class1* pTest = new Class1();
pBase->next     = pTest;

Class1* pClass1;
pClass1 = *pBase->next;

Но с C ++ это действительно мешает так, что вы будете платить за это позже. Просто воспользуйтесь одним из приведений, упомянутых Патриком.

1 голос
/ 18 февраля 2010

Если - во время разработки - вы уверены, что next указывает на экземпляр Class1, сделайте следующий указатель Class1 вместо базового указателя.

Если вы не уверены и знаете это только во время компиляции, вам придется использовать динамическое приведение (возможно, следующий будет указывать на экземпляр Class2 позже).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...