web-dev-qa-db-fra.com

note: 'person :: person ()' est implicitement supprimé car la définition par défaut serait mal formée

Je travaille sur un exemple de programme pour m'aider à apprendre les structures en C++. Voici mon code:

#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

int nextPersonID = 0;
int nextAddressID = 0;

struct date {
    int day;
    int month;
    int year;
};

struct address {
    int id;
    string address;
    date effectiveDate;
    date expirationDate;
};

struct person {
    int id;
    string name;
    date birthdate;
    const int numberOfAddresses;
    address addresses [1];
};

int main () {
    person bob;
    bob.name = "Bob";
    bob.id = nextPersonID;
    nextPersonID++;
    bob.birthdate.day = 1;
    bob.birthdate.month = 1;
    bob.birthdate.year = 1990;
    bob.numberOfAddresses = 1;
    bob.addresses[0].address = "31415 E. Pi Blvd.";
    bob.addresses[0].id = nextAddressID;
    nextAddressID++;
    bob.addresses[0].effectiveDate.day = 1;
    bob.addresses[0].effectiveDate.month = 1;
    bob.addresses[0].effectiveDate.year = 1990;
    bob.addresses[0].expirationDate.day = 1;
    bob.addresses[0].expirationDate.day = 1;
    bob.addresses[0].expirationDate.day = 2020;
    cout << bob.name;
}

Mais lorsque j'essaie de compiler, cela échoue avec note: 'person::person()' is implicitly deleted because the default definition would be ill-formed.. Voici mon journal de build:

-------------- Build: Debug in DataStructures (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe -Wall -g -std=c++11 -I"C:\Program Files (x86)\CodeBlocks\MinGW_Dev_Libs\include\SDL2" -c C:\Users\Duncan\Documents\C++\Challenges\DataStructures\DataStructures.cpp -o obj\Debug\DataStructures.o
C:\Users\Duncan\Documents\C++\Challenges\DataStructures\DataStructures.cpp: In function 'int main()':
C:\Users\Duncan\Documents\C++\Challenges\DataStructures\DataStructures.cpp:32:12: error: use of deleted function 'person::person()'
C:\Users\Duncan\Documents\C++\Challenges\DataStructures\DataStructures.cpp:23:8: note: 'person::person()' is implicitly deleted because the default definition would be ill-formed:
C:\Users\Duncan\Documents\C++\Challenges\DataStructures\DataStructures.cpp:23:8: error: uninitialized non-static const member 'const int person::numberOfAddresses'
C:\Users\Duncan\Documents\C++\Challenges\DataStructures\DataStructures.cpp:39:29: error: assignment of read-only member 'person::numberOfAddresses'
Process terminated with status 1 (0 minute(s), 1 second(s))
3 error(s), 0 warning(s) (0 minute(s), 1 second(s))

Je ne trouve rien avec Google concernant mon problème. Des idées? J'utilise Code :: Blocks avec g ++.

28
Duncan X Simpson

Eh bien, le problème n'est pas avec cette "note". La "note" explique simplement la raison de l'erreur. L'erreur est que vous essayez de construire par défaut votre objet person lorsque la classe person n'a pas de constructeur par défaut.

Au lieu d'essayer de le construire par défaut, vous pouvez {}- initialise ce membre const et le code compile

person bob = { nextPersonID++, "Bob", {}, 1 };
bob.birthdate.day = 1;
bob.birthdate.month = 1;
bob.birthdate.year = 1990;
...

Alternativement, vous pouvez simplement écrire votre propre constructeur par défaut pour la classe.

25
AnT

Le problème n'a pas à voir avec une "construction par défaut ... lorsque la classe n'a pas de constructeur par défaut". Le problème est lié au fait d'avoir une constante dans la déclaration de la classe et un constructeur qui ne garantit pas que la constante sera définie. Suggérez d'utiliser une "liste d'initialisation".

struct Person {
        int id;
        string name;
        date birthdate;
        const int numberOfAddresses;
        address addresses [1];

        Person(int); // constructor declaration
        Person() : numberOfAddresses(1) {} // constructor definition.
                      // ": numberOfAddresses(1)" is the initializer list
                      // ": numberOfAddresses(1) {}" is the function body
    };
    Person::Person(int x) : numberOfAddresses(x) {} // constructor definition. ": numberOfAddresses{x}" is the initializer list
    int main()
    {
        Person Bob; // calls Person::Person()
        Person Shurunkle(10); // calls Person::Person(int)
    }
0
Quinn Carver