Проходя учебники 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()
Давайте предположим, что msg->dup()
возвращенный void *
то есть указатель на void
, что означает указатель, тип которого компилятор не отслеживает. Но вы можете знать, например, из-за документации по этой функции, или потому что определенные предварительные условия были выполнены, что msg->dup()
вернет указатель на CMessage
, Прежде чем вы сможете использовать возвращаемое значение как таковое, вам нужно сообщить компилятору, какой тип на самом деле. Вы делаете это Кастинг void *
в CMessage *
, который использует синтаксис, который вы видите.
Ничего не происходит в памяти. Это просто приведение типа C-style.
http://en.cppreference.com/w/cpp/language/explicit_cast
Возможно, вы захотите узнать больше об основах языка. C ++ сложен в использовании.