I have a SimpleVector as a class member and I'm getting left of '.push_back' must have class/struct/union

I have tried changing the transactionVector to contain doubles instead of transaction objects and I get the same error message. There doesn't seem to be anything wrong with the push_back function itself because I have tried declaring it in main and using push_back on it and it works fine. The SimpleVector is something I got from a book and I added push_back to it.

When I try to push_back a transaction onto the transaction vector in my makeWithdrawal function in Account.cpp, that is where I get a red squiggly line

Account.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#ifndef ACCOUNT_H
#define ACCOUNT_H


#include <string>
#include <iomanip>
#include <iostream>

//forward declared dependencies
class Withdrawal;
class Transaction; //need this to have SimpleVector of Transactions as a member


//included dependencies
#include "SimpleVector.h"

using namespace std;

class Account
{
	private:
		
		string firstName;		
		string lastName;
		//can't have a static int as account number because all the accounts
		//read from the file will have the same account number as the last account read from the file
		static int accountNumberIncrementor; //starts at 100000000 and is incremented every time an account is made
		int accountNumber;
		string password;
		double balance;
		

		int numTransactions;
		
		SimpleVector<Account>transactionVector();
		
		

	public:
		//constructor
		Account(void);


		//member functions
		void makeWithdrawal();

		void makeDeposit();

		void writeCheck();

		double getTransactionAmount(int transactionNumber);

		bool validateLogin(int givenAccountNumber, string givenAccountPassword);

		void displayUserInfo();

		void showTransactions();

		//destructor
		~Account(void);
};



#endif 



Account.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "Account.h"
//#include "MainMenu.h"
#include "Withdrawal.h"
#include "Transaction.h"


int Account::accountNumberIncrementor = 100000000;

//Constructor
Account::Account(void)
{
	accountNumberIncrementor++;
	accountNumber = accountNumberIncrementor;
	balance = 0.0;
}



//member functions
void Account::makeWithdrawal()
{
	 Withdrawal newWithdrawal;

	 transactionVector.push_back(newWithdrawal);

	 cin.get();
	 

}

void Account::makeDeposit()
{

}

void Account::writeCheck()
{

}

//double Account::getTransactionAmount(int transactionNumber)
//{
//	
//}

bool Account::validateLogin(int givenAccountNumber, string givenAccountPassword)
{
	if(accountNumber == givenAccountNumber && password == givenAccountPassword)
	{
		return true;
	}
	else
	{
		return false;
	}
	
}

void Account::showTransactions()
{

}

//void Account::logOut();
//{
//
//}

void Account::displayUserInfo()
{
	cout << "\n\n\n";
	cout << right << setw(60) << firstName << " " << lastName;
	cout << "\t\t\t\t\t" << "Balance: " << balance << "\n\n";
}


//destructor
Account::~Account(void)
{
}



SimpleVector.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
// SimpleVector class template
#ifndef SIMPLEVECTOR_H
#define SIMPLEVECTOR_H
#include <iostream>
#include <new>       // Needed for bad_alloc exception
#include <cstdlib>   // Needed for the exit function
using namespace std;

template <class T>
class SimpleVector
{
private:
   T *aptr;          // To point to the allocated array
   int arraySize;    // Number of elements in the array
   void memError();  // Handles memory allocation errors
   void subError();  // Handles subscripts out of range

   //int back; // holds index of last array element



public:
   // Default constructor
   SimpleVector()
      { aptr = 0; arraySize = 0;}
      
   // Constructor declaration
   SimpleVector(int);
   
   // Copy constructor declaration
   SimpleVector(const SimpleVector &);
   
   // Destructor declaration
   ~SimpleVector();
   
   // Accessor to return the array size
   int size() const
      { return arraySize; }

   // Accessor to return a specific element
   T getElementAt(int position);

   // Overloaded [] operator declaration
   T &operator[](const int &);

   //calling paramater dataItem instead of value (like in the stl vector) so that 
   //in comments I won't have to say weird things like "the value of value"

   
   void push_back(T dataItem);
   
   
};

//***********************************************************
// Constructor for SimpleVector class. Sets the size of the *
// array and allocates memory for it.                       *
//***********************************************************

template <class T>
SimpleVector<T>::SimpleVector(int s)
{
   arraySize = s;
   // Allocate memory for the array.
   try
   {
      aptr = new T [s];
   }
   catch (bad_alloc)
   {
      memError();
   }

   // Initialize the array.
   //This code is causing problems with making a vector of acounts
   //because an account object can't be set to zero
   //for (int count = 0; count < arraySize; count++)
   //   *(aptr + count) = 0;


}

//*******************************************
// Copy Constructor for SimpleVector class. *
//*******************************************

template <class T>
SimpleVector<T>::SimpleVector(const SimpleVector &obj)
{
   // Copy the array size.
   arraySize = obj.arraySize;
   
   // Allocate memory for the array.
   aptr = new T [arraySize];
   if (aptr == 0)
      memError();
      
   // Copy the elements of obj's array.
   for(int count = 0; count < arraySize; count++)
      *(aptr + count) = *(obj.aptr + count);
}

//**************************************
// Destructor for SimpleVector class.  *
//**************************************

template <class T>
SimpleVector<T>::~SimpleVector()
{
   if (arraySize > 0)
      delete [] aptr;
}

//*******************************************************
// memError function. Displays an error message and     *
// terminates the program when memory allocation fails. *
//*******************************************************

template <class T>
void SimpleVector<T>::memError()
{
   cout << "ERROR:Cannot allocate memory.\n";
   exit(EXIT_FAILURE);
}

//***********************************************************
// subError function. Displays an error message and         *
// terminates the program when a subscript is out of range. *
//***********************************************************

template <class T>
void SimpleVector<T>::subError()
{
   cout << "ERROR: Subscript out of range.\n";
   exit(EXIT_FAILURE);
}

//*******************************************************
// getElementAt function. The argument is a subscript.  *
// This function returns the value stored at the sub-   *
// cript in the array.                                  *
//*******************************************************

template <class T>
T SimpleVector<T>::getElementAt(int sub)
{
   if (sub < 0 || sub >= arraySize)
      subError();
   return aptr[sub];
}

//*******************************************************
// Overloaded [] operator. The argument is a subscript. *
// This function returns a reference to the element     *
// in the array indexed by the subscript.               *
//*******************************************************

template <class T>
T &SimpleVector<T>::operator[](const int &sub)
{
   if (sub < 0 || sub >= arraySize)
      subError();
   return aptr[sub];
}


template <class T>

void SimpleVector<T>::push_back(T dataItem)
{
    // Copy the array size and add 1 to hold the new element
    int newArraySize = this->arraySize + 1;

    T* newTempArrayPtr;
    
    // Allocate memory for the new array.
    newTempArrayPtr = new T [newArraySize];
    if (aptr == 0)
    {
         memError();
    }

    //copy elements of original array to new temporary array
    for (int i = 0; i < arraySize; i++)
    {
        newTempArrayPtr[i] = aptr[i];
    }

    //set value in last index of newTempArrayPtr to be value of dataItem
    newTempArrayPtr[newArraySize - 1] = dataItem;

	//change SimpleVector's member variable arraySize to be the size of the new array
	arraySize = newArraySize;

    //make aptr point to address of the array that newTempArrayPtr points to
    aptr = newTempArrayPtr;

}



#endif  



SimpleVector.cpp
Last edited on
Compare
1
2
3
4
SimpleVector<Account>transactionVector();
void makeWithdrawal();

int rand();
Ok thanks for the tip. I think I have it working now. I changed the declaration of transactionVector to be this

 
SimpleVector<Transaction>transactionVector;
Topic archived. No new replies allowed.