|
Good morning,
I need help in designing a class in C++. For experimental purposes I started with something simple.
// Header File Planets.h Declares class Planets.
class Planets
{
public:
double Mercury;
private:
double weight;
};
//Implementation file Planets.cpp implements the member
//functions of Class Planets.
#include "stdafx.h"
#include "Planets.h"
double Planets::Mercury
// Pre: Earth weight.
// Post: Earth weight times the gravitation constant
// of Mercury - 0.4155.
{
return wgh * 0.4155;
}
// MT_Planets.cpp : main project file.
#include "stdafx.h"
#include <iostream>
#include "Planets.h"
using namespace std;
int main()
{
double iWgh = 235.6;
double MyWgh;
MyWgh = Planets.Mercury(iWgh);
cout << "My weight on Mercury is: " << MyWgh << endl;
system("pause");
return 0;
}
When I try to compile the project I get the following error:
Error 1 error C2063: 'Planets::Mercury' : not a function c:\Documents and Settings\Mark McCumber\My Documents\Visual Studio 2005\Projects\Visual C++\MT_Planets\MT_Planets\Planets.cpp 10
Can someone explain to me what I'm doing wrong?
Quecumber256
|
|
|
|
|
Quecumber256 wrote: class Planets
{
public:
double Mercury;
double Mercury();
Quecumber256 wrote: double Planets::Mercury
double Planets::Mercury()
{
return wgh * 0.4155;
}
Mercury - It is a function? Then you missed the ()
Quecumber256 wrote: system("pause");
You MUST not do this. This is bad in several ways. Something like a getch(); or std::cin.get(); will do instead.
It is a crappy thing, but it's life -^ Carlo Pallini
|
|
|
|
|
Rajesh,
Thank you for the reply, but I'm still getting a problem. I'm trying to reprogram my brain to use OOP instead of procedural programming.
The problem is simple in concept. Take a person's Earth weight and calcultate their weight on the other planets of our Solar system. The trick here is it has got to be done using classes and constructors.
For example: MyWgh = Planets.Mercury(235.5) would give me their weight on the planet Mercury. According to the instructions the default constructor should return the weight enter for Earth.
Can you help me grasp this concept?
Quecumber256
|
|
|
|
|
Something similar to:
#include <iostream>
using namespace std;
class Planet
{
private:
double _dFactor;
public:
Planet(double dFactor = 1.0) : _dFactor(dFactor) {}
double localWeight(double dWeightOnEarth)
{
return dWeightOnEarth * _dFactor;
}
};
void main()
{
Planet planetEarth, planetMercury(.38);
double dYourWeight = 235.6;
cout << "If your weight on Earth is " << planetEarth.localWeight(dYourWeight) << endl;
cout << "then weight on Mercury is " << planetMercury.localWeight(dYourWeight) << endl;
}
?
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Thanks, this example helped me with my problem.
Quecumber256
|
|
|
|
|
I'm glad of.
BTW did you notice .38 instead of 0.4155 ?
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Yes I did, but I used 0.4155 because that was the number provided in the text. I bet the number you gave me was the most accurate one.
Quecumber256
|
|
|
|
|
Well, actually your number is accurate, expressing the wrong physical quantity.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
The idea of the assignment will be to teach you polymorphism. I'm assuming you'll want a base class of CPlanet, with more specialised inheriting classes which over-ride the member functions of CPlanet.
So, you would have CEarth, and CMercury both inheriting from CPlanet, and each overriding (eg) GetWeight (double dMass) , and GetDistanceFromSun () , and so on.
// slightly advanced bit here
As there is no need for the CPlanet class to even have an implementation of GetDistanceFromSun, you could even leave it as a pure virtual member function, forcing any inheriting classes to implement it.
// end of slighty advanced bit.
You would end up with:
CEarth earth;
CMercury mercury;
double weight;
weight = earth.GetWeight (100);
cout << "100 kg on earth is : " << weight << endl;
weight = mercury.GetWeight (100);
cout << "100 kg on mercury is : " << weight << endl;
and could even end up with:
CPlanet *planet = GetNthPlanet (5);
double weight;
weight = planet->GetWeight (100);
cout << "100 kg on 5th planet is : " << weight << endl;
delete planet;
CPlanet *GetNthPlanet (int n)
{
switch (n)
{
case 1: return new CMercury;
case 2: return new CVenus;
case 9:
if ( (rand() %100) < 10)
return CPluto;
else
return CPlanetoid;
}
return NULL;
}
I'm hesitant to write much more, as I don't want to spoonfeed you - if you don't struggle a bit, you don't learn.
Iain.
|
|
|
|
|
Iain,
Thanks, but this gets away from my initial problem; defining the Planets class for use.
Quecumber256
|
|
|
|
|
How to determine whether theme is Windows XP Style or Windows Classic Style
|
|
|
|
|
Look in HKCU\Software\Microsoft\Windows\CurrentVersion\Themes.
"Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
|
|
|
|
|
Thank you for your kind reply....
I got another API too............ GetCurrentThemeName()....
|
|
|
|
|
If you open "uxtheme.h", there are several functions in it that might be of your interest.
It is a crappy thing, but it's life -^ Carlo Pallini
|
|
|
|
|
Which I suspect is just a nice wrapper around that registry key I mentioned. Did you get it to work?
"Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
|
|
|
|
|
Try this:
#include "uxtheme.h"
#pragma comment(lib, "uxtheme.lib")
...
if(IsThemeActive())
{
}
It is a crappy thing, but it's life -^ Carlo Pallini
|
|
|
|
|
hello experts;
how to get the IP address of system using MFC code.
How to use the GetSystemInfo(......); function,
|
|
|
|
|
1/ There may be more than one IP address (in fact, all but guaranteed. eg, 127.0.0.1).
2/ Dig through the archives of this forum for the last two or three weeks. Your question was answered recently.
Iain.
|
|
|
|
|
Hi all,
I want to convert char* to unsigned short* string. How would i accomplish it?? Please give me some hint to make it work.
it would be a great help to me.
Thanks
|
|
|
|
|
Search terms to look for:
USES_CONVERSION
A2T
A2W
MultiByteToWideChar
Iain.
|
|
|
|
|
char *subKey = GetLocalMachineName();
int nSize1 = MultiByteToWideChar(CP_ACP, 0, subKey, -1, NULL, 0);
LPWSTR wSubKey = new WCHAR[nSize1];
MultiByteToWideChar(CP_ACP, 0, subKey, -1, wSubKey, nSize1);
I have used above code. In above code function GetLocalMachineName() returns char * string which works correctly as i have debug it. what is the mistake in above code.. Please help me.
Thanks
|
|
|
|
|
I really suggest you read this article[^]. You will learn everything you need to handle the problem (and even much more).
|
|
|
|
|
Your code works fine for me. Are you sure subKey points to a NULL-terminated string?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thank you all of you. I also got my solution
However, Thanks a lot
Regards,
Hemang
|
|
|
|
|
Hello,
perhaps somebody can help me to find the reason for the crashes I have.
I have a MFC Application with MFC extension DLLs.
One of the dialogs is a window with a CPropertySheet.
One CPropertyPage is a host for ActiveX Controls providing extending UI.
This CPropertyPage has a CWnd member to host the ActiveX Controls dynamically created runtime using the CWnd::CreateControl method.
I have a VB ActiveX Control providing needed extending UI.
It can be loaded and used without problems.
The only problem occurs, when the application exits:
1. The CPropertySheet is destroyed ... the CPropertyPage is destroyed, ...
... which releases its previously queried interfaces,
... sends a WM_DESTROY to the CWnd hosting the ActiveX Control and
... deletes/frees the CWnd
2. Somewhere at the end just before invoking "exit" open "OLE" connections/loaded "OLE" libraries are terminated by Microsoft internal code. I saw that the ActiveX OCX module was active until this moment.
3. In the "exit" invocation the MFC application crashes from within the VB ActiveX Control. The VB ActiveX Control does not execute its UserControl_Terminate handler, so it seems, that there happens an irregular deletion of the VB ActiveX Control.
This crash happens currently only in the debug version of our application. But adding CommonControls to the VB ActiveX Control UI causes a crash even in the release version of this MFC application.
Using a MFC ActiveX Control providing some UI, too, no problems occur.
The only difference seen while releasing the last reference to the previously queried interface are that ...
... the release on the interface of VB ActiveX Control returns 4 still valid references,
... while the release on the interface of the MFC ActiveX Control returns only 3 still valid references.
Thus I suspect, that at application end there is still a last reference valid, not released, which causes a crash after the OCX is unloaded from Microsoft internal code cleaning up before the real application exit.
Something in the VB ActiveX Control wants still to work (like executing UserControl_Terminate), but the OCX is already unloaded.
But ... where and how can I find this last reference?
Debugging through the MFC code hosting the ActiveX Control didn't help really?
Has somebody here experienced a similar problem? Or can somebody help?
Thanks in advance,
Martin
|
|
|
|