Указатель на целое число с помощью переинтерпретации - PullRequest
0 голосов
/ 10 декабря 2011

Я пытаюсь привести указатель к другому типу, используя reinterpret_cast

class MyClassA
{
 int x;
 int y;
 public:
    MyClassA();
    ~MyClassA();
};

class MyClassB
{
 int x;
 int y;
 public:
    MyClassB();
    ~MyClassB();
};

Например, если я приведу указатель на MyClassA к MyClassB, с помощью reinterpret_cast это преобразование будет работать?как насчет переносимости кода?

А также, как я уже отмечал:

(5.2.10 / 4) Указатель может быть явно преобразован в любой целочисленный тип, достаточно большой для его хранения.

Означает ли это, что любой указатель, например, MyClassA*, может быть преобразован только в указатель int *?если я прав?

Ответы [ 4 ]

1 голос
/ 10 декабря 2011

Что касается того, работает это или нет, я не знаю, это будет зависеть от реализации.

Однако по стандартам нет гарантии, что это будет работать (поэтому не делайте этого), MyClassA и MyClassB - это два отдельных типа, которые несовместимы, даже если они структурно одинаковы.

То же самое относится к int *.

если вам нужно преобразование между ними, вы можете сделать оператор присваивания от A до B

class MyClassA{
...

    operator=(const MyClassB& mcb)
    {
        this.x=mcb.x;
        this.y=mcb.y;
    }
};

И если вам нужен доступ к целочисленному элементу внутри MyClassA.

//in MyClassA
int& getX(){ return x; }
const int& getX() const { return x; }

int& x=mca.getX();
1 голос
/ 10 декабря 2011

(5.2.10 / 4) Указатель может быть явно преобразован в любой целочисленный тип, достаточно большой для его хранения.

Это означает int* до int. Указатели не являются целочисленными типами.

Приведение указателей не связанных типов является плохой новостью и не должно выполняться. Это может работать, но не переносимо.

Наследование будет работать, хотя. Имейте типы, наследуемые от базового класса!

0 голосов
/ 12 декабря 2011

Мой ответ на первый вопрос - да.Указатель - это просто переменная (целое число), значением которой является адрес другой ячейки памяти.Вот почему вы можете сделать следующее.

(*(void(*)())0)(); /*Ref: Andrew Koenig C Traps and Pitfals*/

или

#define CARD_INTERFACE_ADDRESS 0x4801C
struct A * = new (CARD_INTERFACE_ADDRESS) struct A

MyClassA * ptr_a невозможно (логически) преобразовать в int* ptr_i, потому что вы говорите, чтоадрес, содержащийся в переменной ptr_a, - это адрес MyClassA в первом, а во втором вы говорите, что говоря, что ptr_i - это адрес int.

0 голосов
/ 10 декабря 2011

Это не значит, что вы можете разыгрывать не связанные типы. Это означает, что вы можете привести указатель к 64-битному целому числу (например), если на вашей платформе 64-битное целое число достаточно велико, чтобы содержать значение указателя.

PS: Я хотел бы отметить, что то, что вы сделали, полностью отклоняется от стандарта, но вы можете сойти с рук на многих платформах / компиляторах:)

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