OOP (Object-Oriented Programming) aggregation is a relationship between two classes where one class contains an instance of another class as a member. It represents a "has-a" relationship, where one class has a composition of another class.
In aggregation, the contained class (referred to as the "part" class) can exist independently, and it can be shared by multiple instances of the containing class (referred to as the "whole" class). The lifespan of the part object is not controlled by the whole object. In other words, if the whole object is destroyed, the part object can still exist.
Aggregation is often represented by a member variable of one class being an object of another class. The whole class can access the members of the part class and use its functionality.
In summary, OOP aggregation represents a "has-a" relationship between classes, where one class contains an instance of another class as a member. It provides a way to represent complex relationships and build more flexible and reusable code structures.
Code Example
Address header file
// Address.hpp // Aggregation Example // Created by Kevin Roark on 6/16/23. #ifndef Address_hpp #define Address_hpp #include <string> using namespace std; class Address { private: //class attributes / properties string street; string city; string state; string zip; public: // Getter methods string getStreet() const; string getCity() const; string getState() const; string getZip() const; // Setter methods void setStreet(string newStreet); void setCity(string newCity); void setState(string newState); void setZip(string newZip); //Class Methods void print(); //constructor Address(string street, string city, string state, string zip); Address(); // default constructor }; #endif /* Address_hpp */
This is the header file (Address.hpp
) for a C++ class named Address
. This class can be used to model an address, containing information such as street, city, state, and zip code. It's an example of object-oriented programming in C++, as it encapsulates the data (attributes) and functions (methods) related to an address into a single class.
Here's what each part of this code does:
The
#ifndef
,#define
, and#endif
lines are known as include guards. They prevent potential issues that could arise from including the same header file multiple times.Address_hpp
is a macro that checks if the file has already been included in the project. If not, it definesAddress_hpp
and includes the file.The
#include <string>
directive is used to include the C++ Standard Library string class, which this class uses for its attributes.using namespace std;
allows you to use functions and classes from the std (standard) namespace without prefixing them withstd::
.The class
Address
is defined with four private attributes (street
,city
,state
,zip
) that hold the address information. Being private means they can't be accessed directly from outside the class.It then declares the getter and setter methods, which are used to access and modify the private attributes of the class. The getter methods are marked as
const
, which means they won't modify the object.A
print
method is declared that could be used to print the address information.Two constructors are declared. The first is a parameterized constructor that takes four parameters for initializing an
Address
object. The second is a default constructor, which is a constructor with no parameters. If no constructor is provided in the class, the compiler provides a default constructor. In this case, the default constructor is user-defined.
Code File for Address
// Address.cpp // Aggregation Example // Created by Kevin Roark on 6/16/23. #include <string> #include <iostream> #include "Address.hpp" //Getter methods string Address::getStreet() const { return street; } string Address::getCity() const { return city; } string Address::getState() const { return state; } string Address::getZip() const { return zip; } //Setter Methods void Address::setStreet(string newStreet) { street = newStreet; } void Address::setCity(string newCity) { city = newCity; } void Address::setState(string newState) { state = newState; } void Address::setZip(string newZip) { zip = newZip; } //Class Methods void Address::print() { cout << this->getStreet() << "\n" << this->getCity() << ", "; cout << getState() << "\n" << getZip(); } //constructors Address::Address(string street, string city, string state, string zip) { this->street = street; this->city = city; this->state = state; this->zip = zip; } Address::Address() { street = "NA"; city = "NA"; state = "NA"; zip = "NA"; }
This C++ code file (Address.cpp
) provides the implementations of the methods declared in the Address
class in the Address.hpp
header file.
Here's what each part of this code does:
The
#include
directives at the top include the<string>
and<iostream>
standard library headers, which are used in the methods of theAddress
class, and the"Address.hpp"
header, where theAddress
class is declared.The getter methods (
getStreet()
,getCity()
,getState()
, andgetZip()
) simply return the value of the respective private attributes of theAddress
object. They are marked asconst
because they do not modify any class members.The setter methods (
setStreet()
,setCity()
,setState()
, andsetZip()
) are used to set the value of the respective private attributes of theAddress
object.The
print
method is implemented to print the details of theAddress
object to the console. It uses thecout
object from the<iostream>
standard library to output the details. Thethis->
keyword is used to access the current object's getter methods, although it's not strictly necessary here.Two constructors are implemented:
The parameterized constructor (
Address::Address(string street, string city, string state, string zip)
) sets the values of the private attributes based on the arguments provided when anAddress
object is created.The default constructor (
Address::Address()
) sets all the private attributes to "NA". This constructor is called when anAddress
object is created without any arguments.
Overall, this code is an example of how to implement a class in C++, providing methods to access and modify the class's private attributes and constructors to initialize the objects of the class.
Person header File
// // Person.hpp // Created by Kevin Roark on 6-15-23. #ifndef Person_hpp #define Person_hpp #include <stdio.h> #endif /* Person_hpp */ #include <string> #include "Address.hpp" using namespace std; class Person { private: //class attributes / properties string firstName; string middleName; string lastName; Address* homeAddress; public: //getters and setters declarations void print() const; void setName(string first, string middle, string last); void setLastName(string last); void setFirstName(string first); void setMiddleName(string middle); void setAddress(Address myAddress); string getFirstName() const; string getMiddleName() const; string getLastName() const; Address getAddress() const; //constructor Person(string, string, string, Address* ); };
This is the header file (Person.hpp
) for a C++ class named Person
. The Person
class models a person and their home address. It's another example of object-oriented programming in C++, as it encapsulates the data (attributes) and functions (methods) related to a person and their address into a single class.
Here's what each part of this code does:
The
#ifndef
,#define
, and#endif
lines are include guards. They prevent potential issues that could arise from including the same header file multiple times.Person_hpp
is a macro that checks if the file has already been included in the project. If not, it definesPerson_hpp
and includes the file.The
#include <string>
directive is used to include the C++ Standard Library string class, which this class uses for its attributes."Address.hpp"
is included because this class usesAddress
objects as one of its attributes.using namespace std;
allows you to use functions and classes from the std (standard) namespace without prefixing them withstd::
.The class
Person
is defined with four private attributes:firstName
,middleName
,lastName
, andhomeAddress
. Being private means they can't be accessed directly from outside the class. ThehomeAddress
attribute is a pointer to anAddress
object.Getter and setter methods are declared for accessing and modifying the private attributes of the class. The getter methods are marked as
const
, which means they won't modify the object.A
print
method is declared that could be used to print thePerson
object's information.A constructor is declared that takes four parameters: three strings for the person's first, middle, and last names, and a pointer to an
Address
object for their home address.
Code file for Person
// Person.cpp // Created by Kevin Roark on 6-15-23. // This is a C++ source file that defines a class called "Person". // The class has member functions to manipulate a person's first, middle, and last name. It demostrates aggregation using the Address class // Include necessary header files #include <iostream> // Input/output operations #include <string> // String operations #include "Person.hpp" // User-defined header file for the Person class #include "Address.hpp" //User-defined header file for the Address class using namespace std; // Define the constructor function that initializes the first, middle, and last name of a person using provided parameters and address Person::Person(string first, string middle, string last, Address* homeAdd) { firstName = first; middleName = middle; lastName = last; homeAddress = homeAdd; } //PUBLIC METHODS // Define the member function "print" that prints the first, middle, and last name of a person as well as the address from the Address class void Person::print() const { cout << firstName << " " << middleName << " " << lastName << endl; homeAddress->print(); } // SETTERS // Define the member function "setName" that sets the first, middle, and last name of a person void Person::setName(string first, string middle, string last) { firstName = first; middleName = middle; lastName = last; } // Define the member function "setLastName" that sets the last name of a person void Person::setLastName(string last) { lastName = last; } // Define the member function "setFirstName" that sets the first name of a person void Person::setFirstName(string first) { firstName = first; } // Define the member function "setMiddleName" that sets the middle name of a person void Person::setMiddleName(string middle) { middleName = middle; } //GETTERS // Define the member function "getFirstName" that returns the first name of a person string Person::getFirstName() const { return firstName; } // Define the member function "getMiddleName" that returns the middle name of a person string Person::getMiddleName() const { return middleName; } // Define the member function "getLastName" that returns the last name of a person string Person::getLastName() const { return lastName; } Address Person::getAddress() const { return *homeAddress; }
This C++ code file (Person.cpp
) provides the implementations for the methods declared in the Person
class in the Person.hpp
header file.
Here's what each part of the code does:
The
#include
directives at the top include the standard library headers for input/output operations (<iostream>
) and string operations (<string>
), as well as the user-defined headers for thePerson
andAddress
classes.using namespace std;
allows the use of functions and classes from thestd
(standard) namespace without prefixing them withstd::
.The
Person
constructor (Person::Person(string first, string middle, string last, Address* homeAdd)
) sets the private attributes of aPerson
object based on the provided arguments. This constructor takes three strings for the person's first, middle, and last names, and a pointer to anAddress
object for the person's home address.The
print
method prints thePerson
object's first, middle, and last names, and then uses theprint
method of theAddress
object to print the home address.Setter methods (
setName
,setFirstName
,setMiddleName
,setLastName
) are implemented to modify the respective private attributes of thePerson
object.Getter methods (
getFirstName
,getMiddleName
,getLastName
,getAddress
) are implemented to return the values of the respective private attributes of thePerson
object. ThegetAddress
method returns a copy of theAddress
object pointed to by thehomeAddress
pointer.
Driver Program
// Created by Kevin Roark on 6-15-23 // Driver to demo the Person Class and Address class - Aggregation #include <iostream> #include "Person.hpp" using namespace std; int main() { Address home("1 Donore Square", "San Antonio", "Texas", "78229"); Person myPerson("Kevin", "Read", "Roark", &home); myPerson.print(); cout << endl; return 0; }
This C++ program demonstrates the use of the Person
and Address
classes which were defined in earlier provided code snippets. This is typically called a "driver" program because it drives and tests the functionality of the classes.
Here's what the program does:
It includes the necessary header file (
Person.hpp
), which in turn includes theAddress.hpp
header file.using namespace std;
allows the use of functions and classes from thestd
(standard) namespace without prefixing them withstd::
.It defines a
main
function, which is the entry point of the program.Inside
main
:An
Address
object namedhome
is created with the values"1 Donore Square"
,"San Antonio"
,"Texas"
, and"78229"
for street, city, state, and zip respectively.A
Person
object namedmyPerson
is created with the values"Kevin"
,"Read"
,"Roark"
for first name, middle name, and last name respectively, and a pointer tohome
for the address. Note that the&
operator is used to get the address ofhome
because thePerson
constructor expects a pointer to anAddress
object.The
print
method ofmyPerson
is called, which prints the person's name and address to the console.cout << endl;
prints a newline character to separate the output from the prompt when the program finishes execution.return 0;
indicates that the program has finished execution successfully. It's a convention in C++ and many other programming languages to return 0 from the main function to indicate success.
The overall purpose of this program is to demonstrate how the Person
and Address
classes can be used together to represent and manipulate complex data.