Maison >développement back-end >C++ >Comment initialiser un tableau d'objets sans constructeur par défaut en C ?

Comment initialiser un tableau d'objets sans constructeur par défaut en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-22 20:52:24883parcourir

How to Initialize an Array of Objects Without a Default Constructor in C  ?

Initialisation d'un tableau d'objets sans constructeur par défaut

Lorsqu'ils tentent d'initialiser un tableau d'objets dépourvus de constructeur par défaut, les programmeurs rencontrent souvent l'erreur " X::X() est privé dans ce contexte". Cette erreur se produit car le constructeur par défaut est généralement défini sur private pour empêcher la création involontaire d'objets.

Une solution consiste à utiliser placement-new, un opérateur C de bas niveau qui permet de construire des objets directement dans un bloc de mémoire. Voici un exemple :

class Car
{
    int _no;
public:
    Car(int no) : _no(no) // Initialize _no directly
    {
    }
};

int main()
{
    int userInput = 10;
    void *rawMemory = operator new[](userInput * sizeof(Car)); // Allocate raw memory
    Car *myCars = static_cast<Car *>(rawMemory); // Cast to Car *

    for (int i = 0; i < userInput; ++i)
    {
        new(&myCars[i]) Car(i); // Construct Car objects in-place using placement-new
    }

    // Destruct objects in reverse order
    for (int i = userInput - 1; i >= 0; --i)
    {
        myCars[i].~Car(); // Destroy the object using placement-delete
    }

    operator delete[](rawMemory); // Release raw memory

    return 0;
}

Cette technique permet d'initialiser des tableaux d'objets sans modifier le spécificateur d'accès du constructeur. Il adhère aux meilleures pratiques en évitant les constructeurs par défaut inutiles tout en permettant une création d'objets flexible et efficace.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn