|
Jon's reply is spot on IMHO but maybe a bit of coding philosophy is in order. The distinction between .h and .cpp files is really all about information hiding. That's what he means by scope really. A .h file can be included pretty well anywhere so you can give access to the code it contains to pretty well anything you want just by using a #include. In other words what you really want in the .h file is the interface to whatever code it supports. A fundamental principle of software engineering is to minimise the interface. That means put as little as possible into the .h file and hide the rest in the .cpp file. To a large extent, users of your code only have to worry about what is in the .h file in this case. You're hiding the implementation details from the user (in this case I mean other programmers or you yourself in six months time when you've forgotten how your super duper widget class works).
People can get really stuffy and prissy about using globals and functions that aren't class members.
I find globals extremely useful sometimes. For example I nearly always have an instance of a CLog class that logs diagnostic data to disk from pretty well everywhere in everything I write. Making this a global means I don't have to worry about passing it around everywhere as a parameter. If you limit yourself to a few cases like this then I don't have a problem with globals.
Non-member functions are often recommended by the gurus. Stroustrup uses them a lot in 'The C++ Programming Language', I think (my copy is at work so can't check it was him), as helper functions. His argument is solid (if a bit too advanced for details here) but it seems to go against the grain of conventional wisdom that says make your functions members of the class on which they operate.
A good set of rules of thumb is only use globals where they really make life easier and implement them like Jon suggests, put your functions in a class as members of that class, and put your class interface in the .h file and it's implementation in the .cpp file. Like all rules these are made to be broken but knowing when you can break them safely only comes with pain and experience.
The point really is that you need to strive towards coding correctly but if you make a few wrong decisions along the way nobody's going to shoot you. There aren't many coders out there who can honestly look at code they wrote six months ago and not find something they would do differently now.
The good thing about C++ is you can write really really bad code and it will still work (generally speaking....). It's only when you come back to a big project a few months down the line that your inexperience will bite you in the ass. But then again, if you're working on a big project there should be plenty of people around to rip your code to bits for you so you don't make those mistakes in production code.
That's the biggest tip any newbie can get. Get your code reviewed. If you haven't got a guru handy then do it yourself against a book.
Anyway, end of sermon. Hope that helps and welcome to the mad house .
i1.2sqrt(u).bcos(ur)sec(c)
but
b4.isqrt(u).ru/16
|
|
|
|
|
I plan to buy Visual C# Standard Edition, but what have Visual C# Pro that Visual C# Standard doen't have?
Do you know in details so you can write down as much as you know !!
the price is not so important to me!
I give you for this if you can help!
------------------------------------
Rickard Andersson, Suza Computing
ICQ#: 50302279
I'm from the winter country SWEDEN!
------------------------------------
|
|
|
|
|
I don't know the difference,but if the price is not important(also I don't know the prices of them;)) why don't you buy newer version?In visual studio6 ,pro. version had more features.
Mazy
Don't Marry a Person You Can Live With...
Marry Someone You Can Not Live Without
|
|
|
|
|
ok Does the CTrayNotifyIcon class by P.J Naughter work for an mdi app cos I can't get it to go.
Anyone else got it to work (properly) or have you just used sdi apps like everyone else?
|
|
|
|
|
C'mon Chris surely you know about this having written a wrapper around this API.
|
|
|
|
|
Of course it does! The implementation is precisely no different at all.
Sorry to dissapoint you all with my lack of a witty or poignant signature.
|
|
|
|
|
hi,
i tried playing a wave file by using PlaySound() function
#include "Mmsystem.h"
...
...
PlaySound("trumpet.wav",NULL,SND_FILENAME);
...
it gave the following error:
playDlg.obj : error LNK2001: unresolved external symbol __imp__PlaySoundA@12
Debug/play.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
i came to know that u need to add wavelib.lib file in
Project->settings->Link,which I rightly did.But then it says there is no wavelib.lib file in the folder.I tried to download the file from web but i could not find it.
Can anyone suggest where can I get the file or else can anyone say y it happens.
Thanx in advance
Kamal
pollachikk@yahoo.com
|
|
|
|
|
According my msdn it says to use winmm.lib declared in mmsystem.h
I did a local search for winlib.lib and didn't find anything
but i did find winmm.lib.
So here's my advice...try that and see what happens...
Cheers
"An expert is someone who has made all the mistakes in his or her field" - Niels Bohr
|
|
|
|
|
|
[removed]
modified 27-Nov-11 9:29am.
|
|
|
|
|
[removed]
modified 27-Nov-11 9:30am.
|
|
|
|
|
Ah, I see.
What people have done in the past is create a class whos member variable is the variable to be initialized at program start. Then just create one global instance of that class.
Tim Smith
Descartes Systems Sciences, Inc.
|
|
|
|
|
DOH, stupid me. Create any class and create a global instance of it. Use that to perform any program start initializations.
Tim Smith
Descartes Systems Sciences, Inc.
|
|
|
|
|
Looks like a factory pattern is what you want.
/ravi
"There is always one more bug..."
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
|
One use of a factory design pattern is to ensure that objects are properly initialized during construction. I assume this is what you'd like to accomplish via the static constructor. To implement a factory pattern for the class CFoo, do the following:
- Make CFoo's constructor protected, thereby preventing anyone from doing CFoo* pFoo = new CFoo(); which could create an uninitialized instance.
- Implement the static method CFoo* CFoo::Create(); that serves up a properly initialized object. The static method can set the class's static member is required.
You should browse thru the gang of 4 book. I think you'll enjoy it.
/ravi
"There is always one more bug..."
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Seems to me like a Singleton pattern would do the job better. BTW the standard (well Nov96 draft at least) says a constructor can't have a static modifier (12.1 para 4) if you want official confirmation.
i1.2sqrt(u).bcos(ur)sec(c)
but
b4.isqrt(u).ru/16
|
|
|
|
|
I think the Singleton pattern is better suited when you want to expose methods from the one and only instance of a class.
But I agree that the ClassFactory pattern can do more than serve up a single class. In fact, it's power lies in the fact that it can serve up specializations of a general base class.
/ravi
"There is always one more bug..."
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
A static constructor without a this? What would you be constructing?
Tim Smith
Descartes Systems Sciences, Inc.
|
|
|
|
|
There is no such thing. You'd do something like:
class C
{
public:
static int m_stat_var;
static int stat_func() { return 1; }
};
int C::m_stat_var = C::stat_func();
--Mike--
"There are only a limited number of jobs where they will ask to see the sausage. Most of them are in movies."
-- Christian Graus, 2/11/2002
My really out-of-date homepage
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan.
|
|
|
|
|
[removed]
modified 27-Nov-11 9:31am.
|
|
|
|
|
That's Just The Way It's Done. It's similar to the situation when you write "extern int n;" in a header file. You still need to actually declare the variable "int n;" in a .cpp file.
--Mike--
"There are only a limited number of jobs where they will ask to see the sausage. Most of them are in movies."
-- Christian Graus, 2/11/2002
My really out-of-date homepage
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan.
|
|
|
|
|
[removed]
modified 27-Nov-11 9:31am.
|
|
|
|
|
Well, I can't really answer that since I don't know C#, so don't know what you mean by a static constructor.
--Mike--
"There are only a limited number of jobs where they will ask to see the sausage. Most of them are in movies."
-- Christian Graus, 2/11/2002
My really out-of-date homepage
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan.
|
|
|
|
|
Nish [BusterBoy] wrote:
Why am I re-declaring the static int
You're not redeclaring it. The .h file declares it - the .cpp allocates storage for it. If you omitted it from the .cpp file you'd get an unresolved reference link error.
/ravi
"There is always one more bug..."
http://www.ravib.com
ravib@ravib.com
|
|
|
|