указатели — запутанная запись в C ++ (OMNeT ++)

Проходя учебники OMNeT, которые даны по адресу: http://www.omnetpp.org/doc/omnetpp/tictoc-tutorial/part2.html в уроке 9 я наткнулся на несколько запутанных обозначений:

void Tic9::sendCopyOf(cMessage *msg)
{
cMessage *copy = (cMessage *) msg->dup();
send(copy, "out");
}

Код довольно короткий и аккуратный, однако из-за того, что у меня мало опыта работы с C ++ / OMNeT, я не мог понять, что здесь делает эта строка: cMessage *copy = (cMessage *) msg->dup(); более конкретно (cMessage *), я знаю msg->dup() на самом деле означает (*msg).dup(),

Кто-нибудь может уточнить, что на самом деле происходит в памяти?

Добавить Редактировать Приложение:

код для dup():

virtual cMessage *dup() const
{
return new cMessage(*this);
}

описание для dup(): Создает и возвращает точную копию этого объекта.
Значит ли это, что (cMessage *) msg->dup() внутренне передает адрес объекта, возвращенного msg->dup() в *copy?

Другая запутанная запись:

cMessage *Tic9::generateNewMessage()
{
// Generate a message with a different name every time.
char msgname[20];
sprintf(msgname, "tic-%d", ++seq);
cMessage *msg = new cMessage(msgname);
return msg;
}

Что это * перед именем класса означает здесь: *Tic9::generateNewMessage()

-5

Решение

Давайте предположим, что msg->dup() возвращенный void * то есть указатель на void, что означает указатель, тип которого компилятор не отслеживает. Но вы можете знать, например, из-за документации по этой функции, или потому что определенные предварительные условия были выполнены, что msg->dup() вернет указатель на CMessage, Прежде чем вы сможете использовать возвращаемое значение как таковое, вам нужно сообщить компилятору, какой тип на самом деле. Вы делаете это Кастинг void * в CMessage *, который использует синтаксис, который вы видите.

0

Другие решения

Ничего не происходит в памяти. Это просто приведение типа C-style.

http://en.cppreference.com/w/cpp/language/explicit_cast

Возможно, вы захотите узнать больше об основах языка. C ++ сложен в использовании.

0

По вопросам рекламы [email protected]