ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это дешевый и грязный хак, не очень C ++, и ненавистники будут его ненавидеть. Но эй. Если ты должен делать то, что должен, и то, что тебе нужно, это POD, то это сработает.
Если вы можете взять элементы данных, которые вы хотите memset
, и поместить их в свой собственный POD, вы можете настроить этот POD. Для остроумия (POD, о котором идет речь, это структура BucketOBits
):
ПРИМЕЧАНИЕ. Важно, чтобы используемый здесь тип данных был POD (Plain Old Data). Подробнее о том, что это значит, см. эту запись FAQ .
#include <cstdlib>
#include <cstring>
class Interface
{
public:
virtual void do_it() const = 0;
virtual ~Interface() {};
};
class Object : public Interface
{
public:
Object();
void do_it() const {};
private:
struct BucketOBits
{
int int_a_;
int int_b_;
int int_c_;
} bucket_;
};
Object::Object()
{
memset(&bucket_, 0, sizeof(bucket_));
};
int main()
{
Interface* ifc = new Object;
}
Еще лучше, вы можете использовать тот факт, что инициализация значений для целочисленных типов означает нулевую инициализацию, и полностью избавиться от memset
, в то же время может даже сделать ваш код немного быстрее, чем если бы вы использовали memset
. Используйте конструкцию по умолчанию для BucketOBits
в инициализации конструктора:
Object::Object() : bucket_()
{
};
EDIT2:
Если у базовых и производных классов есть члены-данные, которые нуждаются в нулевой инициализации, вы все равно можете использовать этот метод, передав каждому классу свой собственный BucketOBits
. Показательный пример:
#include <cstdlib>
#include <cstring>
class Interface
{
public:
virtual void do_it() const = 0;
Interface();
virtual ~Interface() {};
private:
struct BucketOBits
{
unsigned base_int_a_;
unsigned base_int_b_;
long base_int_c_;
} bucket_
};
class Object : public Interface
{
public:
Object();
void do_it() const {};
private:
struct BucketOBits
{
int int_a_;
int int_b_;
int int_c_;
} bucket_;
};
Interface::Interface() : bucket_()
{
}
Object::Object() : bucket_()
{
}
int main()
{
Interface* ifc = new Object;
}