I'm working on an example program to help me learn structs in C++. Here's my 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;
}
But when I try to compile, it fails with note: 'person::person()' is implicitly deleted because the default definition would be ill-formed.
. Here's my build log:
-------------- 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))
I can't find anything with Google relating to my problem. Any ideas? I'm using Code::Blocks with g++.
Well, the problem is not with that "note". The "note" simply explains the reason for the error. The error is that you are trying to default-construct your person
object when class person
does not have a default constructor.
Instead of trying to default-construct it, you can {}
- initialize that const member and the code will compile
person bob = { nextPersonID++, "Bob", {}, 1 };
bob.birthdate.day = 1;
bob.birthdate.month = 1;
bob.birthdate.year = 1990;
...
Alternatively, you can simply write your own default constructor for the class.
The problem has not to do with the default-constructor. There is a constant in the class declaration but the default (no argument) constructor does not guarantee that the constant will be defined. Suggest using an "initializer list".
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)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With