Introduction to Programming and C++

Contents Previous Topic Next Topic

Recall that if list is explicitly declared to be of a particular type, for example,

class Box {
	private:
		int n;
	public:
		int m;
		Box( int a ):n(a) {
			// empty constructor
		}

		int get_n() {
			return n;
		}
};

If any variable of this type is explicitly declared to be of type Box, its member functions or member variables may be accessed directly using the directly using the . operator:

#include <iostream>
using namespace std;

// Add the Box class here

int main() {
	Box box(3);

	cout << box.get() << endl;
	box.m = 5;

	return 0;
}

If, however, the object was dynamically allocated using new and your access to it through a pointer, you must first dereference the pointer:

#include <iostream>
using namespace std;

// Add the Box class here

int main() {
	Box *ptr = new Box(3);

	cout << (*ptr).get() << endl;
	(*ptr).m = 5;
	cout << (*ptr).m << endl;

	return 0;
}

Due to precedence, it is necessary to wrap the dereferenced pointer in parentheses. This awkward, and consequently, the following short form was introduced:

#include <iostream>
using namespace std;

// Add the Box class here

int main() {
	Box *ptr = new Box(3);

	cout << ptr->get() << endl;
	ptr->m = 5;
	cout << ptr->m << endl;

	return 0;
}

Rules of Thumb

If the variable is a pointer, use ->, otherwise use ..

If you are using dynamically allocated memory, use ->, otherwise use ..

In Project 1, variables such as list_head, list_tail, and next_node are all addresses, and consequently, to access a member function of the node they are referring to, you must use, for example, list_head->retrieve() or list_head->next_node. In the operator= (assign) function, the argument is passed by reference, and is consequently not a pointer but is a reference to the actual object. For this argument, you must use the . operator, for example, list.head() or list.size().


Contents Previous Topic Top Next Topic