Visual C++/MFC Tutorial - Lesson 2: C++ Essentials

Lesson 2: C++ Essentials

If you want to use Microsoft Visual C++, it helps a ton if you really know C++. Everything is about classes. If you are used to plain C, you won't really see the big deal with classes until you use them for a while. Let's review what you need to know about classes to get started with VC++.

A class is a structure for the most part. Let's work with an example instead of me just telling you rules. Let's make a class to represent a line. In the .h file you would define the class as follows:

class CLine 
{ 
 int m_nX1; 
 int m_nY1; 
 int m_nX2; 
 int m_nY2; 

public: 
 // constructors 
 CLine(); 
 CLine(int x1, int y1, int x2, int y2); 

 // destructor 
 ~CLine(); 

 // set the line data 
 void SetPoints(int x1, int y1, int x2, int y2); 

 // draw the line 
 void Draw(); 
} 

A quick word about naming conventions. Class names usually start with 'C' and the member variables usually are prefixed by a 'm_'. Then in the microsoft way you will have a letter to let you know what data type the name is and then the name of the variable. Capitalize the letter of all new words in the name. Don't use underscores and stuff like that. I recommend this Microsoft standard (called Hungarian notation) since it is widely accepted and very easy to read. If you see m_pPoint, you would assume this is a member variable of a class that points (it is a pointer) to a point. If you see fData, you would assume that it is a floating-point value.

Back to our class. The int variables are the end points of the line. Note that they are before the 'public:' part. This means that a programmer using this class will not be allowed to manipulate these guys directly. They are not for 'public' use. The functions under the public statement are for public use. The first three are called constructors. These functions are called anytime a new CLine class is created. Here are some examples when the are called:

// this calls CLine()
CLine MyLine; 

// this is a pointer to a CLine class
CLine *pMyLine; 

// this  calls CLine()
pMyLine = new CLine; 

// this is a pointer to a CLine class
CLine *pMyLine; 
// this calls CLine(int x1, int y1, int x2, int y2)
pMyLine = new CLine(0,0,10,10); 

// this calls CLine(int x1, int y1, int x2, int y2)
CLine MyLine(0,0,10,10); 

All of these construct a line. Some initialize it to its default settings and others copy coordinates. The 'new' keyword is used to create new things in C++, like malloc in C. You need to call 'delete' for everything you say new to, like free in C. This goes for classes as well as other data types. I could allocate an array of 100 integers with:

// a pointer to some integers
int *pNumbers; 

// make memory for 100 of them
pNumbers = new int[100]; 

// set the first element to 0
pNumbers[0]=0; 

// set the last element to 99
pNumbers[99]=99; 

// free the memory.
delete [] pNumbers; 

Notice the [] after the delete. This is to tell the program to delete the entire array. If you say 'delete pNumbers;' you will only free memory for the first element. You will then be 'leaking' memory. Memory leaks are when you forget to delete memory. This may end up crashing your computer if you use all the computers memory.

Sorry, let's get back to the constructors for CLine. The code for these constructor functions which automagically get called when a new line is created will look like:

CLine::CLine() 
{ 
 m_nX1=0; 
 m_nX2=0; 
 m_nY1=0; 
 m_nY2=0; 
}
CLine::CLine(int x1, int y1, int x2, int y2) 
{ 
 m_nX1=x1; 
 m_nX2=x2; 
 m_nY1=y1; 
 m_nY2=y2; 
} 

Notice that the function declaration is much like a regular 'C' function except that we put the class name and two colons in front of the function name (CLine::). One difference with constructors is that they don't have a return value. This is the case for destructors also. A destructor is the function which automagically gets called when our CLine is deleted or goes out of scope. For instance:

// this is a pointer to a CLine class
CLine *pMyLine; 

// this  calls CLine()
pMyLine = new CLine; 

// memory for the class is cleared up and ~CLine() is called
delete pMyLine; 

{ 
 // this  calls CLine()
 CLine MyLine; 
} 

// this '}' ends the section of the program where MyLine is
// valid. ~CLine() will be called. (MyLine goes out of 'scope')

For our class, ~CLine() doesn't need to do anything. However, sometimes you may want to put your cleanup code here. Like deleting any allocated memory in your class. Since we have nothing to do out function code is empty:

CLine::~CLine() 
{ 
 // do nothing
} 

Let's fill in the other 2 functions.

void CLine::SetPoints(int x1, int y1, int x2, int y2) 
{ 
 m_nX1=x1; 
 m_nX2=x2; 
 m_nY1=y1; 
 m_nY2=y2; 

 return; 
} 

void CLine::Draw() 
{ 
 // psuedo code here, these are operating system 
 // functions to draw a line
 MoveTo(m_nX1, m_nY1); 
 LineTo(m_nX2, m_nY2); 

 return; 
} 

How would I call these functions? Here are a couple of examples. One with pointers and one without.

CLine *pLine = new CLine(0,0,10,10); 
pLine->Draw(); 
delete pLine; 

CLine MyLine; 
MyLine.SetPoints(0,0,10,10); 
MyLine.Draw(); 

That's it for the class. Now this class can be used in other classes. You can imagine a CSquare class that has 4 Cline classes in it:

class CSquare 
{ 
 CLine m_LineTop; 
 CLine m_LineLeft; 
 CLine m_LineBottom; 
 CLine m_LineRight; 
 //... 
} 

Or better yet, the point of all of this class stuff, you can use the CLine class to make your own class. This is done a ton in Visual C. Lets say you wanted to draw lines in your program, and you thought the line class might be nice, but it is missing an important feature, it doesn't let you set the line color. Instead of writing a whole new class, you can simple inherit the CLine class. This would look like this:

class CColorLine : public CLine 
{ 
public: 
 void Draw(long color); 
}; 

What's going on here? Well with this class we have all the functionality of our other class, but now we can use this other Draw() function which allows us to set the color. The CPP code would look like:

void CColorLine::Draw(long color) 
{ 
 // psuedo code here, these are operating system 
 // functions to draw a line 
 SetColor(color); 

 CLine::Draw(); 
 return; 
}

Now we have all the functionality of the other class but we added an extra function called Draw. But it's the same name as our other Draw! No matter. Cpp is smart enough to know that if you call Draw(color) to use the new function, but if you call Draw() it will use the old function. The strange part of the code may be CLine::Draw(). This just tells our program to call the base class's Draw function. We save ourselves from having to write that LineTo and MoveTo code again. Pretty cool, huh? Now we can do something like this:

CColorLine MyLine; 
MyLine.SetPoints(0,0,10,10); 

// assuming 0 is black, this will draw a black line.
MyLine.Draw(0); 

Of course I'm leaving out a ton of aspects and things here. Like defining operators, overriding functions, virtual functions, protected and private members... the list goes on. You have enough to get started though.



Comments

  • How to find out if Oracle is installed in a Windows machine using VC++ program?

    Posted by ashokdotnet on 02/17/2009 02:54am

    I need to write a code to find if Oracle client is installed in a Windows computer using VC++ code. Please help me with the code.

    Reply
  • good article

    Posted by gap001 on 10/06/2005 09:21pm

    but how do I go to next lesson. Dont' see next lesson link

    Reply
  • God bless you.

    Posted by Legacy on 12/22/2003 12:00am

    Originally posted by: returnGoodguy

    I'm a newbie about programming!
    It was so coooooooooool~!
    Thx. ;)

    Reply
  • COOL AND FAST

    Posted by Legacy on 07/16/2003 12:00am

    Originally posted by: Hariprasad Ravikiran K

    I was just looking for such a tutorial to ship me safely and quickly from mid C++ to VC++ and MFC.
    Great Job !

    Reply
  • visual c++ lesson 2.0

    Posted by Legacy on 06/29/2003 12:00am

    Originally posted by: eager mfclearner

    that was nice

    • Good Article

      Posted by abuaathiqa on 05/26/2005 12:58am

      I appreciate the author of the article. It helped me to correct myself about C++.

      Reply
    Reply
  • Very nice

    Posted by Legacy on 04/21/2003 12:00am

    Originally posted by: Costi

    Very nice

    Reply
  • Simplest

    Posted by Legacy on 04/03/2003 12:00am

    Originally posted by: Pradeep Bilurkar

    The simplest tutorial I ever found.

    Reply
  • My wife wants you

    Posted by Legacy on 03/07/2003 12:00am

    Originally posted by: Micky Mouse

    You are biggest, Al� bless you.

    Reply
  • God Bless you!

    Posted by Legacy on 01/27/2003 12:00am

    Originally posted by: javaProgrammer

    Great help for me to get started, a Java programmer thrown into a product development including VC++, MFC, and all that confusing and vast world of Microsoft.
    Thanks a ton man.

    Reply
  • Fits my needs perfect

    Posted by Legacy on 11/27/2002 12:00am

    Originally posted by: Eric Pearson

    This tutorial is actually perfect for what I need.
    I used a little C++ in college, been using java and .Net/C# ever since. Now I just needed some re-explanation on object scope, pointers, etc for C++ and this does it perfectly for me.

    Reply
  • Loading, Please Wait ...

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: September 10, 2014 @ 11:00 a.m. ET / 8:00 a.m. PT Modern mobile applications connect systems-of-engagement (mobile apps) with systems-of-record (traditional IT) to deliver new and innovative business value. But the lifecycle for development of mobile apps is also new and different. Emerging trends in mobile development call for faster delivery of incremental features, coupled with feedback from the users of the app "in the wild". This loop of continuous delivery and continuous feedback is …

  • The explosion in mobile devices and applications has generated a great deal of interest in APIs. Today's businesses are under increased pressure to make it easy to build apps, supply tools to help developers work more quickly, and deploy operational analytics so they can track users, developers, application performance, and more. Apigee Edge provides comprehensive API delivery tools and both operational and business-level analytics in an integrated platform. It is available as on-premise software or through …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds