• 0

C++ linked list and objects


Question

I have been given an assignment from my uni to create a bank where im to have customers with multiple accounts and different account types, also then add other things like loans etc.

Im having problems getting a linked list to work with the class objects. my aim is to store all the customers details, and account details in the class objects then list all the customers in the linked list instead of using something like an array as we get more marks for using linked lists.

so far i have managed to get it so the customer can be created and pointing to just one account. but i am stuggling with understanding how im to then create the linked list so it connects to the class object.

these are some bits of the code which i have so far:

AssignmentBank.cpp (main)

	Account tempAccount(001, 500, 600, "Current");
	Customer tempCustomer("Fred", 01, 0.5, 'M',"180690", &tempAccount);
	CustomerList CL;	
	CL.addCustomer(&tempCustomer);

with this im not sure if im doing it the correct way, but am i to create the objects then pass in the refference to it, which is then stored in the linked list?

CustomerList.cpp

#include "CustomerList.h"
#include <iostream>

using namespace std ;

CustomerList::CustomerList()
{
    front = back = 0;
}

bool CustomerList::isEmpty()
{
   return front == 0;
}


void CustomerList::addCustomer(Customer *tempCustomer)
{
	Node* insert  = new Node(tempCustomer); 
	if (front == 0)
   {
      back = front = insert;
   }
   else
   {
      back-> next = insert ;      
	   back = back -> next ;
   }
}

CustomerList::removeCustomer()
{
   Customer tempCustomer; Node* temp;

	if (front != 0)
   {
      tempCustomer = front -> customerRef;
      temp = front;
      front = front -> next ;
      delete temp ;
      if (front == 0) back = 0;
      return tempCustomer;
   }
   else return '\0';

}


CustomerList::~CustomerList()
{
   Node * temp;
	while(front != 0)
	{
		temp = front;
		front = front -> next;
		delete temp;  
	}
}


void CustomerList::print()
{
	Node * temp = front;
   if (temp != 0 ) 
   {
	   while (temp != 0)
	   {
		   cout << temp -> customerRef.getName() ;
		   temp = temp -> next;
      }
   }
   else cout << "empty";
   cout << endl;

}

CustomerList.h

#include "Customer.h"

class Node
{
public:
	Node* next;
	Customer customerRef;
	Node(tempCustomer)
	{
		Customer *tempCustomer;
		next = 0;
	}	
};


class CustomerList
{
	Node* front;
        Node* back;
public:
	CustomerList();
	~CustomerList();
	void addCustomer(Customer *tempCustomer);
   removeCustomer( );
	bool isEmpty();
   void print() ;

};

any help at all would be useful.

I have gone to extra classes at uni and asked lecturers over and over but they dont seem to be helping me much.

Link to comment
https://www.neowin.net/forum/topic/955220-c-linked-list-and-objects/
Share on other sites

7 answers to this question

Recommended Posts

  • 0

The problem is your Node class: you have to decide whether you want it to hold copies of Customers or references(pointers) to Customers. Both approaches are valid yet different. If you go with references, you have to ensure that the original Customers remain alive otherwise the references will soon point to nothing. If you go with values (copies), there's no dangling reference issue but of course you encur the performance cost of the copy.

This is basically how I would code it:

struct Node // if you only want public members, use a struct, it's the same thing as class except everything is public by default
{
        Node* m_next;
        Customer& m_customer;
        Node(Customer& customer) : m_next(0), m_customer(customer) {}   
};

And then the addCustomer method would look virtually identical to yours (except I like references better when I can use them):

void CustomerList::addCustomer(Customer& customer)
{
    Node* insert  = new Node(customer); 
    if (front == 0)
   {
      back = front = insert;
   }
   else
   {
      back->next = insert;   
      back = back ->next;
   }
}

  • 0

A struct is a class in C++. They are literally duplicate keywords. The only difference is that default visibility is private in a class, whereas it is public in a struct. So if all it takes to satisfy your teacher is to not use the keyword "struct", change "struct" by "class" and add "public:" before the member declarations. :laugh:

Seriously though, it's not clear to me what your teacher meant by that. The C++ way of doing a linked list is usually:

#include <list>

int main()
{
    // look ma no code
    std::list<int> linkedList;
    linkedList.push_back(1);
    // etc
}

  • 0

thank you, i got it working after playing around a little with what i already had. can now add customers and display them how i need to.

problem is now i want to be able to have multiple accounts for each customer.

at the moment i have:

customer.cpp

Customer::Customer(string tempName, string tempTelNo, double tempInterestRate, char tempSex, string tempDoB, Account *bankAccount)
{
	name=tempName;
	telNo=tempTelNo;
	interestRate=tempInterestRate;
	sex=tempSex;
	DoB=tempDoB;
	accountRef=bankAccount;
}

and an example of creating a customer is:

AssignmentBank.cpp

CL.addCustomer(new Customer("Fred", "01785211211", 0.5, 'M',"110284", new Account(002, 600, 700, "Current")));

thing is i want to be able to make lots of accounts without a limit really.

and if i go to the array option then i cant change the size of the array can i?

can someone point me in the right direction of how i can do this?

  • 0

You need a linked list structure for everything you need a list of - customers, accounts, etc. Rather than duplicating the linked list code for each type of list, look into templating!

When creating your new example customer, you'd do it something like:

Customer* custTmp = new Customer("Fred", "01785211211", 0.5, 'M', "110284");
CustTmp->addAccount(new Account(002, 600, 700, "Current"));
CustTmp->addAccount(new Account(003, 601, 701, "Current"));
//etc
CL.addCustomer(custTmp);
custTmp = 0; //no need to keep a copy of the pointer here in main(), the linked list has it and can handle freeing up memory when necessary, safer to disarm this!

  • 0
  On 23/11/2010 at 00:18, theblazingangel said:

You need a linked list structure for everything you need a list of - customers, accounts, etc. Rather than duplicating the linked list code for each type of list, look into templating!

When creating your new example customer, you'd do it something like:

Customer* custTmp = new Customer("Fred", "01785211211", 0.5, 'M', "110284");
CustTmp->addAccount(new Account(002, 600, 700, "Current"));
CustTmp->addAccount(new Account(003, 601, 701, "Current"));
//etc
CL.addCustomer(custTmp);
custTmp = 0; //no need to keep a copy of the pointer here in main(), the linked list has it and can handle freeing up memory when necessary, safer to disarm this!

I understand how to create them as you have mentioned, just not to sure how to add the references of the accounts to the customer.

  • 0

I haven't used C++ in quite some time, but when I did, I made an arraylist class. Just a doubly linked list... I found it pretty fun to make, and I put it on Google Code.

You can check out the adding method here, among many others: http://code.google.com/p/arraylist/source/browse/trunk/arraylist.cpp#119

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • From cars to cosmos: Honda's experimental rocket aces first landing test by Paul Hill Image via Honda Watch your back SpaceX, the Japanese company Honda has just performed a successful first launch of its experimental reusable rocket. The 6.3 meter rocket, which weighs 900kg, reached a modest altitude of 271.4 meters, but managed to land within 37cm of its target (1.2 feet), which is certainly pretty close. The rocket took off from a Honda facility in Taiki Town, Hokkaido, a growing space town in Japan. The flight time was also modest, coming in at just 56.6 seconds, but in that time, Honda was able to demonstrate key reusability technologies such as flight stability and landing capability. This marks a significant milestone for Honda’s space R&D department, which began work just four years ago. If you remember the tests SpaceX was performing around 2012 with Grasshopper, well Honda is at about the same stage with its reusable rocket. Why Honda is building rockets: Beyond cars and motorcycles Honda said that it wants to leverage core technologies it already works on for offering space services. It said that reusable rockets are a key part of sustainable space transportation. By 2029, the company wants to be able to perform suborbital launches, and while commercialization hasn’t been decided yet, it sees itself launching remote-sensing and wide-area communication satellites in the future. The Japanese car maker sees growing demand for satellite launches and wants to be involved by developing reusable rockets which could help it perform such launches economically. If it does end up finding customers, it will add more competition to the rocket launch sector. While the company hasn’t confirmed this, by developing its own launch system, it could eventually be in a position to launch its own satellites that could provide services to its cars to add value for customers. The competitive landscape and Japan's space ambitions Honda is just the latest company to join the growing list of companies trying to develop reusable rocket technology. The most famous companies doing this are SpaceX and Blue Origin, but there are also lots of other companies around the world also developing this technology. Honda is still taking baby steps compared to SpaceX, but it shows that the company is taking a focused, step-by-step approach, and achieving successes as noted by this launch. Hopefully, the company ends up providing tough competition against SpaceX, Blue Origin, and other companies so that it can help to drive down prices and spur on innovation.
    • Does that subscription include international data roaming, inclusive of Russia?
    • If you're stupid enough to try and get one, each and every headache along the way is on you. I can only hope that these roadblocks on a pre-order are enough to dissuade people.
    • "You should have a Microsoft Account because we can help keep your data safe...until we can't." As an IT guy I know that I should never put my trust in one backup solution if the data is important. But for non-IT people, they are getting tricked into Microsoft's practices with falsehoods.
    • it is delayed and has no definitive release date... that is "delayed indefinitely".
  • Recent Achievements

    • Week One Done
      TBithoney earned a badge
      Week One Done
    • First Post
      xuxlix earned a badge
      First Post
    • First Post
      Tomek Święcicki earned a badge
      First Post
    • One Year In
      carlitin86 earned a badge
      One Year In
    • Reacting Well
      Peterlll06 earned a badge
      Reacting Well
  • Popular Contributors

    1. 1
      +primortal
      684
    2. 2
      ATLien_0
      289
    3. 3
      Michael Scrip
      228
    4. 4
      +FloatingFatMan
      192
    5. 5
      Steven P.
      145
  • Tell a friend

    Love Neowin? Tell a friend!