Skip to main content
gamedev.net
🔒 Locked

Composition problem

Started by braves May 2, 2000 at 11:31 AM 2 replies 600+ views
Original Post
braves
braves
Hello everyone, I have a question about Composition. I want to have a class called Points inside class called Poly. Now at design time I don’t know how many points Poly will have so I want to make a pointer to Points and at the same time pass a constructor. Here is a example: class Poly { public : Poly(int px, int py, int amount, float 0x,0y) : Points(0x,0y); private : Points *ThePoints; int amount, x, y; //Amount is the amout of // points poly will have }; class Points { public : Points(float, float); ~Points(); private : float x, y; }; Now my question is, when do I allocate the memory for Points? I would think I allocate it in the constructor of Poly but the constructor for Points would be called before Poly if i'm correct? So how can it be called if there is no memory allocated for it? If someone can help, I thank you a great deal because I can't figure out where to put ThePoints new Points[amount]; Thanks again braves Edited by - braves on 5/2/00 12:36:46 PM
Aragorn
Aragorn
Hi
At first this will be NO real answer to your question. I not
very good in C++ so please corect me if I''m wrong.(I have just read one book and not much experince). But I think it have to be:
ThePoints = new Points[amount];

And what is px and py in Poly if it is suposed to be the position I think you don''t need it, because the Poly positition is in a way give by the positions of the point the Poly is made of.
Then I wanted to add that if I understood it right you give with 0x and 0y the cordinats of ONE point, so you create a Poly with one defined Point how are you define the other Points, with a function of Points? If yes, why don''t you first Construct a Poly with x points and then define the points with an other function:
BOOL DefPoints(int *Points);//Points is an array of Points Cordinats

Now a last one question, isn''t that:

class a {
public:
a() : b();
~a();
};

class b {
b();
...
};
just used to call when b is parent class of a and then only written in the implementation?
May the force be with you
braves
braves
Aragorn,
I just added px and py just so I have something to the constructor. I wanted more parameters than the ones being passed too the Point class(this is not what my class really looks like, It’s just an example) I was thinking about adding another member function that defines the points like you said and was planning on doing it. Than curiosity came in and I wanted to know how to do it, just to know. So I hope someone can help me.
braves


Kylotan
Kylotan
quote:

I would think I allocate it in the constructor of Poly but the constructor for Points would be called before Poly if i'm correct? So how can it be called if there is no memory allocated for it?

Remember, to the compiler your class is not composed of Points anymore. It is composed of a pointer to Points, the size of which is already known. No matter whether this poly uses 1 Point or 100 Points, your actual Poly class is the same size.

This also poses you another problem: you can initialise members in a constructor, but you don't have a member which is of type Point, just a pointer to one. Therefore using the member initialiser syntax to initialise a Point is not gonna work.

And which Point were you hoping to initialise with 0x, 0y (invalid identifiers, surely?) All of the points in your array? The first one only? You need to give this some more thought.

I might use a constructor similar to this:

Poly :: Poly(int a) : amount(a)
{
ThePoints = new Points[amount];
}


Initialising the points will be more tricky. I don't think you'd want to get into variable length parameter lists, so you'll need some way of accessing individual Points later. Or change your design so that a Poly starts off empty and you add points as you go along, with a function like Poly::AddPoint(Point& newPt).

Edited by - Kylotan on 5/3/00 5:04:50 AM

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.