Good OOP Examples/Resources for C++ 11?

Started by
6 comments, last by DragonBooster 10 years, 3 months ago

Hi guys.

I have a question regarding C++. Its about good OOP design, i already know about Polymorphism,Encapsulation,Classes,Functions and etc.

However , i want to avoid spaghetti code. What tips or advice would you give me if i want to create clean and clutterless C++ code?

Would this be a good OOP code example ?


//File: Classes.h

class EXP_Variables 
{
public:
	int EXP;
};


class EXP_Gain : public EXP_Variables
{
public:
	int CalcEXP (int LV,int Rate)
	{
	EXP = LV * Rate;
	return (EXP);
	}; 
};


class Print_EXP : public EXP_Gain
{
public:
	int EXP_Print () 
	{
	cout << "Your Current Expierence is "<< EXP <<endl;
	return 0;
	}

}exprin;


// File: Main.cpp

int main ()
{
	exprin.CalcEXP(7,88);
	exprin.EXP_Print();

	system("pause");
	return 0;
};
Advertisement
To be blunt, I cringe pretty hard at that code both stylistically and for the way its put together.

You're misusing inheritance, the one class you end up with has confused responsibilities, furthermore you're setting yourself up for having different classes for each stat which is almost certainly pointless, you instantiate Print_EXP directly from its definition, and your use of caps and underscores is odd.

As suggested reading, google "Liskov Substitution Principle", "single responsibility principle" and "composition vs inheritance C++", also try to find some resources on C++ style. In general, most people tend to follow a style that's vaguely C#ish, or follow the style of the C++ standard library (which is what I recommend).

throw table_exception("(? ???)? ? ???");

Further to the above comment (which was very good btw, I'm googling some of those terms right now) I'm not sure about your two public methods, neither need to return a value, so they should just be void (instead of int).

Also you don't need to have return 0 in main, it's part of the standard that the compiler will do that for you.

Object orientation is a modelling technique. What are you modelling here? I suspect the example is too small to demonstrate good OO design.

That said, regardless of the context I would have to say that I see little value to that particular code. It looks like a classic case of over-use of inheritance, which is a common mistake in inexperienced OO users. The classes are artificial, I couldn't see them being used in a real program.

By having a public member variable you generally forfeit the ability to encapsulate the classes internals from the rest of the program. This can make sense when the class has no interesting invariants, a classic example being a mathematical vector.

To be clear, I don't mean my prior comments to be harsh. Its clear you're still learning, and in the early stages the simple act of putting code together that actually compiles and does something useful is a small victory in itself. The fact that you're interested enough to try to do better and seek feedback is a good sign that you're on the right path.

It can sometimes be hard to ask for feedback when you suspect you might not be doing things the right way because it can leave you feeling a bit vulnerable. But if you're earnest, ask good questions, and show that you're listening, most everyone here is happy to help. Never be discouraged if someone doesn't have anything positive to say, its just constructive criticism.

throw table_exception("(? ???)? ? ???");

Thank you for your advice, i greatly appreciate it.

I think that i should have not rushed the code since i myself thought that the code was not good. I basically wanted to know more techniques used with OOP that are vital. Most of the stuff you guys have mentioned i already know, but before i design Object Oriented Classes, i always write it on paper to know what it is used for and what it includes. This is my first time just doing random code which turned out quite badly.

What other principles should i study because i never heard of:

-Liskov Substitution Principle.

-Single Responsibility Principle.

-Composition vs Inheritance.

To be clear, I don't mean my prior comments to be harsh. Its clear you're still learning, and in the early stages the simple act of putting code together that actually compiles and does something useful is a small victory in itself. The fact that you're interested enough to try to do better and seek feedback is a good sign that you're on the right path.

It can sometimes be hard to ask for feedback when you suspect you might not be doing things the right way because it can leave you feeling a bit vulnerable. But if you're earnest, ask good questions, and show that you're listening, most everyone here is happy to help. Never be discouraged if someone doesn't have anything positive to say, its just constructive criticism.

Being Blunt is the best advice one can get and i wanted criticism on purpose so i know that i need to improve so thanks alot :).

A great start is the SOLID object oriented principles from "objectmentor":

That said, learning good design is a practical skill, you need to get some experience building larger and larger programs to really feel the benefits and understand the costs of different approaches.

Two other skills interact with this. One is learning how to refactor code that is poorly designed and evolve it towards a better design. This means you don't have to get the design perfect up front, you can make mistakes, learn from them, and still make progress on your project. Another is learning to use version control, for much the same reasons (and many more).

A great start is the SOLID object oriented principles from "objectmentor":

That said, learning good design is a practical skill, you need to get some experience building larger and larger programs to really feel the benefits and understand the costs of different approaches.

Two other skills interact with this. One is learning how to refactor code that is poorly designed and evolve it towards a better design. This means you don't have to get the design perfect up front, you can make mistakes, learn from them, and still make progress on your project. Another is learning to use version control, for much the same reasons (and many more).

This exactly why i also wanted to create a 3D game. It will improve my C++ OOP skills by noticing bad design and as you said, learning from those mistakes to improve the bad design into a better design. A 3D game is huge which makes it perfect for understanding OOP since a lot of the game will require it.

Thank's alot for the advice, it truly helps.

This topic is closed to new replies.

Advertisement