c ++ приведение char * к объекту? - PullRequest
1 голос
/ 25 марта 2011


Можно ли в C ++ преобразовать массив символов в объект, например, так:

char* bytes = some bytes...
MyObject obj = (MyObject)(bytes);


Как мне определить оператор приведения?
спасибо :)

Ответы [ 4 ]

9 голосов
/ 25 марта 2011

Возможно, вы захотите определить конструктор для MyObject:

class MyObject {
public:
  explicit MyObject(const char* bytes);
  ...
};

MyObject::MyObject(const char* bytes) {
  // do whatever you want to initialize "MyObject" from the byte string
}

, а затем можете использовать его:

char* bytes = some bytes...
MyObject obj = MyObject(bytes);  // this will work
MyObject obj(bytes);             // so will this
4 голосов
/ 25 марта 2011

Я вижу две возможности здесь.Если у вас есть данные, которые, как вы знаете, представляют целевой тип, вы можете использовать reinterpret_cast, чтобы обработать их как объект этого типа:

MyObject *obj = reinterpret_cast<MyObject *>(bytes);

Если вы хотите создать объект указанного типа в указанной памяти, вы используете оператор placement new для создания объекта по указанному адресу:

char *bytes = whatever;

MyObject *obj = new(bytes) MyObject;

Когда вы закончите использовать объект, вы не delete это, вы напрямую вызываете dtor:

obj->~MyObject();

Обратите внимание, что для этого нужно убедиться, что (если ничего больше) bytes указывает на данные, которые правильно выровнены для целевого типа.

3 голосов
/ 25 марта 2011

Если строка на самом деле представляет действительный объект типа MyObject, вы можете получить MyObject* с

reinterpret_cast<MyObject *>(bytes)

(хотя это очень маловероятно, если char*результат приведения указателя к правильно построенному MyObject.)

0 голосов
/ 25 марта 2011

Мне нравятся ответы Джерри Коффина и Ларсмана, в зависимости от того, находится ли в данном месте уже построенный объект или нет.

Хотя есть еще одна морщина. Если тип MyObject квалифицируется как POD-класс , тогда может быть достаточно просто использовать повторную привязку к указателю, как предложил Ларсман, поскольку конструктор для объекта не требуется

Я говорю «может», потому что удаленно возможно, что ваша платформа использует разные представления для char * и указателей классов. Большинство из тех, что я использовал, не делают этого, хотя.

...