Кастинг в C ++ с использованием указателей - PullRequest
0 голосов
/ 05 февраля 2020

Возникли небольшие проблемы с пониманием концепции приведения в C ++. Как работает литье при использовании указателей? Когда возникает проблема времени компиляции или времени выполнения?

// class type-casting
#include <iostream>
using namespace std;

class CDummy {
    float i,j;
};

class CAddition {
    int x,y;
  public:
    CAddition (int a, int b) { x=a; y=b; }
    int result() { return x+y;}
};

int main () {
  CDummy d;
  CAddition * padd;
  padd = (CAddition*) &d;
  cout << padd->result();
  return 0;
}

1 Ответ

3 голосов
/ 05 февраля 2020

Я хочу узнать больше о кастинге в c ++ в целом. Это выглядит намного сложнее, чем у Java, который имеет проверку типов и JVM.

C ++ проверяет типы. Используя приведение в стиле c, вы явно просите обойти все средства защиты, которые предоставляет вам система типов. Вы не должны использовать c -тиски в стиле C ++, а скорее static_cast, dynamic_cast и в редких случаях const_cast и в еще более редких случаях reinterpret_cast ,

Если вы замените приведение c в стиле

padd = (CAddition*) &d;

на приведение C ++:

padd = static_cast<CAddition*>(&d);

, то компилятор сообщит вам, что вы делаете неправильно:

prog.cc:19:36: error: invalid static_cast from type 'CDummy*' to type 'CAddition*'
   padd = static_cast<CAddition*>(&d);

Я не думаю, что это может быть более понятным: CDummy* - это не CAddition*, поэтому вы не должны разыгрывать эти типы.

Поскольку вы делаете, ваш код имеет неопределенное поведение . Ни стандарт C ++, ни компиляторы не заботятся о том, чтобы сделать что-либо значимое с кодом, который имеет неопределенное поведение (отсюда и название: просто не определено, что вы получите).

PS В вашем примере вы может обеспечить преобразование:

class CAddition {
    int x,y;
  public:
    CAddition (const CDummy& cd) : x(cd.i),y(cd.j) {}
    CAddition (int a, int b) : x(a),y(b) {}
    int result() { return x+y;}
};

Используя такой конструктор преобразования , вы можете легко создать CAddition из CDummy (вам нужно сделать элементы public в CDummy или предоставьте некоторые другие средства доступа к ним для выполнения этой работы.)

PPS Я был немного неаккуратным, когда сказал выше, что приведение C ++ безопаснее. Они все еще делают хороший инструмент, чтобы выстрелить себе в ногу. Необходимость сотворения обычно является запахом кода / дизайна. Не попадайтесь в ловушку глушения предупреждений / ошибок компилятора, помещая приведения в ваш код. Это может быть хорошо в Java, но в C ++ дела обстоят хуже.

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