|
Please see the code bellow.
#include <iostream>
#include <stdlib.h>
using namespace std;
class Cpolygon
{
protected:
int width, height;
public:
void setvalues (int a, int b)
{
width=a;
height=b;
}
};
class Crectangle:public Cpolygon
{
public:
int area ()
{
return(width*height);
}
};
class Ctriagle:public Cpolygon
{
public:
int area()
{
return((width*height)/2);
}
};
int main(int argc, char *argv[])
{
Crectangle rect;
Ctriagle tril;
Cpolygon *Poly1 =▭
Cpolygon *Poly2 =&tril;
Poly1->setvalues(4,5);
Poly2->setvalues(4,5);
cout<<Poly1->area()<<endl;
cout<<Poly2->area()<<endl;
system("PAUSE");
return 0;
}
I have two questions.
1.
Cpolygon *Poly1 =▭
Cpolygon *Poly2 =&tril;
What does these two lines indicate?
2. Instead of creating two objects of base class can we use only one object of base class to set the values.
i.e.
Cpolygon *Poly;
So that
Poly->setvalues(4,5); need to call only once and create the objects of derived class and show the outputs i.e.
Crectangle *rect;
Ctriagle *tril;
cout<<rect->area()<<endl;
cout<<tril->area()<<endl;
will it work?
Thanks for reading.
|
|
|
|
|
Before answering your question, I think there should be a small modification in your code of the Cpolygon class: you should have a virtual area function:
class Cpolygon
{
...
virtual int area() = 0;
};
Otherwise those two lines won't compile:
cout<<Poly1->area()<<endl;
cout<<Poly2->area()<<endl;
First question: you have two pointers to a base class and you make them point to derived classes. This would be more or less similar as this:
Cpolygon *Poly1 = new Crectangle();
Cpolygon *Poly2 =new Ctriangle();
Which is seen more often.
In fact the whole purpose of this code is to show you the use of polymorphism (I suggest you google for it to have a lot more examples). The base principle is that you can manipulate objects of different types (Crectangle and Ctriangle) exactly the same way: they all implement a known interface (Cpolygon). This way, you can store them all in a container and you don't need to know which exact type you are manipulating. Each time you call a virtual function (like area()), it will be "redirected" to the correct type. This is one of the most basic and fundamental principle of object oriented programming.
|
|
|
|
|
A new comers' reply:
For question 1:
Try the step below:
Add "virtual int area() =0;"(of course it is a public member) in the definition of class Cpolygon.
For the lesson, search virtual class on the Internet.
For question 2:
I admire your imagination.
It is possible, but not in your way.
See the use of "constructor". Especially "default constructor."
With ears and eyes.
|
|
|
|
|
I'm in the process of making a simple 2D game and I'd like to put my three rows of circles into three loops where 15 are drawn and translated over 28 units for each time, but I've been running into some issues. Could I get ya'll to take a look at my code and explain what I'm doing wrong? Here's my code:
int Circle1 [20];
for
(Circle1=0; Circle1<15; Circle1++)
{
glPushMatrix();
glTranslatef(d+28,455,1);
random_generator(0,3);
if (randomValue == 0)
{
glColor3f(0,.5,0);
}
else if (randomValue == 1)
{
glColor3f(.5,0,0);
}
else
{
glColor3f(0,0,.5);
}
glLineWidth(1.0);
drawCircle(14,200);
glPopMatrix();
}
when I compile it I get errors for the
(Circle1=0; Circle1<15; Circle1++)
line of code saying:
In function 'displayFunction':
error: incompatible types when assigning to type 'int[20]' from type 'int'
warning: comparison between point and integer
error: lvalue required as increment operand
Ultimately I'm making a game in which you use a cannon to shoot the same color circles, you'll have a five minute timer to get rid of them all. There will be three rows of circles, with one of three randomly generated colors (red, blue or green). I got my random color generation working, but since I had it on every circle in the drawfunction the colors were changing everytime the screen refreshed. So I need to put the random color generation in my main function and use an array to point at my drawCircle function. However I thought it might be easier if I drew my circles with a for loop. It's 15 circles per row and I had been planning on doing three loops so I only had to worry about the x component.
What I was trying to do with that piece of code was to draw my 15 cicles, keep the y component and translate the x component over 28 units for each circle so you have:
OOOOOOOOOOOOOOO
a row of fifteen side by side circles
modified on Wednesday, December 9, 2009 3:01 AM
|
|
|
|
|
It might help if you described the trouble.
|
|
|
|
|
Apologies, when I compile it I get errors for the
(Circle1=0; Circle1<15; Circle1++)
line of code saying:
In function 'displayFunction':
error: incompatible types when assigning to type 'int[20]' from type 'int'
warning: comparison between point and integer
error: lvalue required as increment operand
|
|
|
|
|
Chidori-chan wrote: error: incompatible types when assigning to type 'int[20]' from type 'int'
Well, of course. Circle1 is an array of integer, you can't compare an array of integer to a simple int. What are you trying to achieve here exactly ?
|
|
|
|
|
Ultimately I'm making a game in which you use a cannon to shoot the same color circles, you'll have a five minute timer to get rid of them all. There will be three rows of circles, with one of three randomly generated colors (red, blue or green). I got my random color generation working, but since I had it on every circle in the drawfunction the colors were changing everytime the screen refreshed. So I need to put the random color generation in my main function and use an array to point at my drawCircle function. However I thought it might be easier if I drew my circles with a for loop. It's 15 circles per row and I had been planning on doing three loops so I only had to worry about the x component.
What I was trying to do with that piece of code was to draw my 15 cicles, keep the y component and translate the x component over 28 units for each circle so you have:
OOOOOOOOOOOOOOO
a row of fifteen side by side circles
I'm guessing my attempt was totally off the mark?
|
|
|
|
|
Lose the [20] on the definition of Circle1. You've define it as an array of 20 integers and they try to use it as a single integer. That will get rid of the compiler error, I think, but it's hard to say if it will then do what you want based in so little information.
You measure democracy by the freedom it gives its dissidents, not the freedom it gives its assimilated conformists.
|
|
|
|
|
That did get rid of the compile error thank you.
However you're correct in thinking it might not do what I want. It was only drawing one circle that can be seen. However, you all's posts made me realize I should be calling the int o I have in the translation. This kinda worked, except it drew them too close together.
My revised portion is:
int o = 54;
for
(o=0; o<15; o++)
{
glPushMatrix();
glTranslatef(o+28,455,1);
random_generator(0,3);
if (randomValue == 0)
{
glColor3f(0,.5,0);
}
else if (randomValue == 1)
{
glColor3f(.5,0,0);
}
else
{
glColor3f(0,0,.5);
}
glLineWidth(1.0);
drawCircle(14,200);
glPopMatrix();
}
This is what it looks like:
http://img.photobucket.com/albums/v222/Carlota/Circles.png
I need to get the circles to be side by side. Though I was under the impression I needed to do this in an array so that later I could set up if then statements to change flags so I could turn the circle off if it was hit by the fired circle?
modified on Wednesday, December 9, 2009 3:39 AM
|
|
|
|
|
Look at your code and then look at the picture.
You're translating the circles in 1 pixel increments (glTranslatef(o+28,455,1); , where o is incremented by 1 each pass through the for loop), and that's exactly what the image shows - the circles are drawn almost on top of one another, with each one 1 pixel further to the right than it's predecessor.
If you want the circles side by side, increase the offset between them.
And storing indices to the circles in an array will probably make processing the circles easier later, but it isn't absolutely necessary. Take it one step at a time - get your circles drawn where you want them first, then try optimizing the code (using an array, for instance) after you've gotten the basics working.
By the way, your code would be more readable, and you'd probably get better responses, if you straightened out the indenting.
|
|
|
|
|
Thank you so much! I have my circles being drawn perfect, here's how I ended up doing this:
void drawCircleRow1()
{
for
(o=0; o<15; o++)
{
random_generator(0,3);
glPushMatrix();
glTranslatef((o+1.9)*28,455,1);
if (randomValue == 0)
{
glColor3f(0,.5,0);
}
else if (randomValue == 1)
{
glColor3f(.5,0,0);
}
else
{
glColor3f(0,0,.5);
}
glLineWidth(1.0);
drawCircle(14,200);
glPopMatrix();
}
}
picture:
http://img.photobucket.com/albums/v222/Carlota/CircleLoop.png
|
|
|
|
|
Chidori-chan wrote: but I've been running into some issues
Which are ?? Without a clear description of the problem, we won't be able to help you at all...
Anyway, if you are interested, you can also look at my sig, there's a link to a series of tutorials about game programming with OpenGL.
|
|
|
|
|
By MSDN, that CDC::LineTo(pt) will draw a line to, but not include the specified "pt".
Why is that? any special purpose?
|
|
|
|
|
Because that is the way Microsoft designed it; maybe you should ask them. In many cases the next drawing command will start from the x,y point of the previous one, so I assume this is for efficiency.
|
|
|
|
|
thanks,
you said ask microsoft. do you mean I should post this to MSDN forum? or just mail to someone?
|
|
|
|
|
fitatc wrote: you said ask microsoft. do you mean I should post this to MSDN forum? or just mail to someone?
Try one of the Microsoft forums. How important is it to you to know?
|
|
|
|
|
Thank you very much.
Richard MacCutchan wrote: Try one of the Microsoft forums. How important is it to you to know?
To my work, not a bit.
To mySelf, I am kind of serious man,
|
|
|
|
|
anybody has clearly defination of De Boor method ??
thank very much !!
|
|
|
|
|
You can check out the book by Carl DeBoor: "A Practical Guide to Splines". The programs in that book are in FORTRAN but can be easily rewritten in C++. I read that book in 1986 and learned a lot. Hope that can help you, too.
|
|
|
|
|
We need more coders/designers on our team to develop an AI like none other. The AI, Codenamed Project Vital, will change the world and could turn over enormous profits, but only if it is successful. We could use any help we can get, from little experience to advanced experience. If this project is a success, and even if it isn't, it will be a great learning experience, as well as something, or something else, to add to your programming profile.
Thank you for considering Project Vital,
Gabe Parmley, CEO of Parmley Interactive
gabeparmley@gmail.com
|
|
|
|
|
Shouldn't this be in the 'Jobs' forum?
|
|
|
|
|
but its not a paying job, atleast not yet, its a C++ project and anyone can help
|
|
|
|
|
Your websites aren't very informative. Just a mass of broken links and dead pages.
You measure democracy by the freedom it gives its dissidents, not the freedom it gives its assimilated conformists.
|
|
|
|
|
yes, we are working on getting them back online, sorry for the inconvenience.
|
|
|
|
|