I have been rushing trying to get this done by Monday 2am est. I'm trying to create a new project which consists of at least two classes: a base class and a derived class. The code of your project should include

* a composite object
* an example of inheritance
* at least one virtual and at least one pure virtual function
* at least one overloaded function
* at least one example of pointers
* at least one example of dynamic memory allocation

My code is garbled and incomplete, due to the fact I'm learning about pointers & dynamic memory allocation while putting this all together. It's definitely still a "work" in progress, and I'm moving everything around. I'm trying to determine how to represent the 'composition' portion of my code. Should I use ammo? Since the two derived classes have different amounts of it? Or Declare ammo as a virtual function since the sub-classes will represent different numbers - but both have ammo?

// Week6iLab_RyanRodgers.cpp : main project file.

#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>

using namespace std;

class Gun //abstract class
{
public:
	Gun() { };
	string name;
	void shoot(int, double, int, int, int);
	virtual void reload() = 0;
	virtual void print() = 0; //pure virtual function
	virtual void damage() = 0; //virtual function
	virtual ~Gun(); //virtual destructor
    static int ammo;
};

void shoot(int ammo, double hitPercent, int hit, int miss, int shotsFired)
{
	ammo-- ;
	shotsFired = hit + miss;
	hitPercent = hit / shotsFired;
	miss = shotsFired - hit;
	void print();
	cout << "Shots: " << shotsFired << endl;
	cout << "Hit %: " << hitPercent << endl;
}

class MachineGun : public Gun //example of inheritance & derived class
{
public:
	void setGunData(string name, void(*shoot)(void);
	void shoot();
	void print();
};

void 

class Pistol : public Gun
{
public:
	int ammo = 7;
};


int main()
{
	Gun myGun;
	myGun.shotsFired=shoot();
	Gun *myGun();
	myGun = new Gun();
	myGun->ammo = hitPercent;
    return 0;
}

Recommended Answers

All 10 Replies

void shoot(int ammo, double hitPercent, int hit, int miss, int shotsFired)

should be

void gun::shoot(int ammo, double hitPercent, int hit, int miss, int shotsFired)

Do you know what a static data member means in C++? It seems unlikely that every gun shares the same number of bullets. ;)

void shoot(int ammo, double hitPercent, int hit, int miss, int shotsFired)

should be

void gun::shoot(int ammo, double hitPercent, int hit, int miss, int shotsFired)

Do you know what a static data member means in C++? It seems unlikely that every gun shares the same number of bullets. ;)

I toyed around with the code a little bit. Your posts, have helped immensely. I'm still a little bit shaky on how to print the "Shots: " and Hit %: ". Here's what I have so far:

// Week6iLab_RyanRodgers.cpp : main project file.
#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>

using namespace std;

class Gun //base class
{
protected:
        int shotsFired;
        int hit;
        int miss;
        double hitPercent;
        string name;

        int ammo; 

public:
        Gun();
        Gun(int); // overloaded constructor
		Gun(int, double);
        virtual ~Gun(); //virtual destructor

        void shoot(int, double, int, int, int);
        void reload();
        virtual void print() = 0; //pure virtual function
        virtual void damage(); //virtual function 
    
};

// Define functions for class
Gun::Gun() 
{
        shotsFired = 0;
        hit = 0;
        miss = 0;
        hitPercent = 0.0;
        name = " ";
        ammo = 0;
}

Gun::Gun(int rounds) 
{
        if (rounds >= 0) {
                ammo = rounds;
        }
}

void Gun::shoot(int ammo, double hitPercent, int hit, int miss, int shotsFired)
{
    ammo--;
    shotsFired = hit + miss;
    hitPercent = hit / shotsFired;
    miss = shotsFired - hit;
}

void Gun::Gun(int, double)
{
    cout << "Shots: " << shotsFired << endl;
    cout << "Hit %: " << hitPercent << endl;
}

void Gun::shoot(int, double, int, int, int)

Gun::~Gun() { } //destructor



class MachineGun : public Gun //example of inheritance & derived class
{
public:
        MachineGun();
        void print();
};


// MachineGun class constructor, passes 30 rounds to parents
// overloaded constructor
MachineGun::MachineGun() :Gun(30) 
{
        name = "Machine Gun";
}

void MachineGun::print() 
{
        cout << "Your machine gun has " << ammo << " shots left." << endl;
}

class Pistol : public Gun
{
public:
        Pistol();
        void print();
};

Pistol::Pistol() :Gun(7)
{
        name = "Pistol";
}

void Pistol::print() 
{
        cout << "Your pistol has " << ammo << " shots left." << endl;
}


int main()
{
        MachineGun *mGun = new MachineGun(); // dynamic allocation of pointer
        mGun->print(); // prints number of bullets left
        
        Pistol *mPistol = new Pistol();
        mPistol->print();

        // free these pointers' memory
        delete(mGun);
        delete(mPistol);
}

I have to construct the main method so that it will test each and every member function of the parent and the child classes. Could I scrap the 'damage' as a virtual function, and replace it with 'reload' as a virtual func?

Hmz. You want to split those classes up in files perhaps. Do you know how to do so? If you do, please do. It clears up the structure of your program a lot (and saves compiling time, yeey). But it's not necessary of course.

Oh, and normally people code classes like this..

class monkey {
  public:
  protected:
  private:
};

In that order, functions first, variables last. But again no biggy.

You seem to have an aweful lot of constructors:

Gun::Gun() 
{
        shotsFired = 0;
        hit = 0;
        miss = 0;
        hitPercent = 0.0;
        name = " ";
        ammo = 0;
}

Gun::Gun(int rounds) 
{
        if (rounds >= 0) {
                ammo = rounds;
        }
}

void Gun::Gun(int, double)
{
    cout << "Shots: " << shotsFired << endl;
    cout << "Hit %: " << hitPercent << endl;
}

And some double functions...

void Gun::shoot(int ammo, double hitPercent, int hit, int miss, int shotsFired)
{
    ammo--;
    shotsFired = hit + miss;
    hitPercent = hit / shotsFired;
    miss = shotsFired - hit;
}

void Gun::shoot(int, double, int, int, int)

My first suggestion is to clean the code up a bit, it'll make it a lot more readable and doesn't take very long.

Are you stuck on anything?

Could I scrap the 'damage' as a virtual function, and replace it with 'reload' as a virtual func?

Decide that for yourself, do you know the difference between a virtual function and a non-virtual function? It's quite an advanced subject.

Decide that for yourself, do you know the difference between a virtual function and a non-virtual function? It's quite an advanced subject.

Advanced/brutal - this language is kicking my a$$. I somehow remain determined though. I believe the difference between a VF & N-VF is that with N-VF's the member function is selected at compile-time based on the type of the pointer (or reference) to the object. And VF's are resolved dynamically, based on the type of the object, not the type of the pointer/reference to that object.

I think I'm getting caught up in the specifics/differences between the pure virtual & virtual functions. Pure is defined by the derived class, so I guess the virtual would be...

Well said! That's indeed the difference between them. Pure virtual functions are just there in the base class when you want to be able to dynamically look it up in derived classes, but don't have an implementation for it in the base: it MUST be defined in the derived classes! That's all I reckon.

Edit: Wiki has a good example:

As an example, an abstract base class "MathSymbol" may provide a pure virtual function doOperation(), and derived classes "Plus" and "Minus" implement doOperation() to provide concrete implementations. Implementing doOperation() would not make sense in the "MathSymbol" class as "MathSymbol" is an abstract concept whose behaviour is defined solely for each given kind (subclass) of "MathSymbol". Similarly, a given subclass of "MathSymbol" would not be complete without an implementation of doOperation().

So, split up those files, clean up the code a bit and restate your problem please.

Well said! That's indeed the difference between them. Pure virtual functions are just there in the base class when you want to be able to dynamically look it up in derived classes, but don't have an implementation for it in the base: it MUST be defined in the derived classes! That's all I reckon.

Edit: Wiki has a good example:
So, split up those files, clean up the code a bit and restate your problem please.

Now my problem is with a library (I think). I'm getting 111 errors, and it starts with the ostream file. I don't know.

// Week6iLab_RyanRodgers.cpp : main project file.
#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

class Gun //base class
{
public:
        Gun();
        Gun(int); // overloaded constructor
        virtual ~Gun(); //virtual destructor

        void shoot(int, double, int, int, int);
        virtual void print() = 0; //pure virtual function
        virtual void reload(); //virtual function        

protected:
        int shotsFired;
        int hit;
        int miss;
        double hitPercent;
        string name;
        int ammo; 
};

// constructor w/ no parameters/define functions for class
Gun::Gun() 
{
        shotsFired = 0;
        hit = 0;
        miss = 0;
        hitPercent = 0.0;
        name = " ";
        ammo = 0;
}

Gun::Gun(int rounds) 
{
        if (rounds >= 0) {
                ammo = rounds;
        }
}

void Gun::shoot(int ammo, double hitPercent, int hit, int miss, int shotsFired)
{
    ammo--;
    shotsFired = hit + miss;
    hitPercent = hit / shotsFired;
    miss = shotsFired - hit;
    cout << "Shots: " << shotsFired << endl;
    cout << "Hit %: " << hitPercent << endl;
}

Gun::~Gun() { } //destructor



class MachineGun : public Gun //example of inheritance & derived class
{
public:
        MachineGun();
        void print();
};


// MachineGun class constructor, passes 30 rounds to parents
// overloaded constructor
MachineGun::MachineGun() :Gun(30) 
{
        name = "Machine Gun";
}

void MachineGun::print() 
{
        cout << "Your machine gun has " << ammo << " shots left." << endl;
}

class Pistol : public Gun
{
public:
        Pistol();
        void print();
};

Pistol::Pistol() :Gun(7)
{
        name = "Pistol";
}

void Pistol::print() 
{
        cout << "Your pistol has " << ammo << " shots left." << endl;
}


int main()
{
        MachineGun *mGun = new MachineGun(); // dynamic allocation of pointer
        mGun->print(); // prints number of bullets left
        
        Pistol *mPistol = new Pistol();
        mPistol->print();

        // free these pointers' memory
        delete(mGun);
        delete(mPistol);
		return ammo;
}

Scratch that last code, here is the same project - a bit cleaned up (but isn't easy on the eyes). I'm still getting those 111 errors that refer me back to some tic-tac-toe project I worked on some while back.

// Week6iLab_RyanRodgers.cpp : main project file
#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

class Gun //base class
{
public:
        Gun();
        Gun(int); // overloaded constructor
        virtual ~Gun(); //virtual destructor
        void shoot(int, double, int, int, int);
        virtual void print() = 0; //pure virtual function
        virtual void reload(); //virtual function        

protected:
        int shotsFired;
        int hit;
        int miss;
        double hitPercent;
        string name;
        int ammo; 
};

// constructor w/ no parameters/define functions for class
Gun::Gun() 
{
        shotsFired = 0;
        hit = 0;
        miss = 0;
        hitPercent = 0.0;
        name = " ";
        ammo = 0;
}

Gun::Gun(int rounds) 
{
        if (rounds >= 0) {
                ammo = rounds;
        }
}

void Gun::shoot(int ammo, double hitPercent, int hit, int miss, int shotsFired)
{
    ammo--;
    shotsFired = hit + miss;
    hitPercent = hit / shotsFired;
    miss = shotsFired - hit;
	void print();
    cout << "Shots: " << shotsFired << endl;
    cout << "Hit %: " << hitPercent << endl;
	if(ammo==0){
		MachineGun::reload();
		Pistol::reload();
	}
}

Gun::~Gun() { } //destructor



class MachineGun : public Gun //example of inheritance & derived class
{
public:
        MachineGun();
		if(ammo==0){
			void reload(30);
		}
        void print();
};


// MachineGun class constructor, passes 30 rounds to parents
// overloaded constructor
MachineGun::MachineGun() :Gun(30) 
{
        name = "Machine Gun";
}

void MachineGun::print() 
{
        cout << "Your machine gun has " << ammo << " shots left." << endl;
}

class Pistol : public Gun
{
public:
        Pistol();
		if(ammo==0){
			void reload(7);
		}
        void print();
};

Pistol::Pistol() :Gun(7)
{
        name = "Pistol";
}

void Pistol::print() 
{
        cout << "Your pistol has " << ammo << " shots left." << endl;
}


int main()
{
        MachineGun *mGun = new MachineGun(); // dynamic allocation of pointer
        mGun->print(); // prints number of bullets left
        
        Pistol *mPistol = new Pistol();
        mPistol->print();

		Gun shoot(5);

		// free these pointers' memory
        delete(mGun);
        delete(mPistol);
		return 0;
}

Errr, that's probably because you included stdafx.. *-) You're working in MSVC++ I presume? If so, put your includes inside that include (stdafx.h), if they aren't there already. ;)

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.