|
public class Class1
{
private Class2 class2;
public Class1()
{
class2 = new Class2();
class2.Class2Event += new EventHandler(class2_Class2Event);
class2.Class2Function();
}
void class2_Class2Event(object sender, EventArgs e)
{
}
}
public class Class2
{
public event EventHandler Class2Event;
public void Class2Function()
{
OnClass2Event(EventArgs.Empty);
}
protected virtual void OnClass2Event(EventArgs e)
{
EventHandler eh = Class2Event;
if (eh != null)
eh(this, e);
}
}
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
thanks a lot!
Alex
|
|
|
|
|
|
While trying to create a Triangle class - a general purpose marker that accepts a location, size, and rotation angle - I keep running into access violations. I don't understand why.
The class declaration includes:
namespace ShapesLibrary
{
class Triangle
{
private Point Anchor;
private Point Vertex1;
private Point Vertex2;
private Point Vertex3;
It's only a partial list, but it shows the relevant details. The constructor for the class includes:
public Triangle(Point anchor, Int32 radius, float angle)
{
Anchor=anchor;
Radius=radius;
Angle=angle;
Vertex1.X = Convert.ToInt32(Radius*Math.Cos(Angle));
Vertex1.Y= Convert.ToInt32(Radius*Math.Sin(Angle));
Vertex2.X = Convert.ToInt32(Radius*Math.Cos(Angle+120));
Vertex2.Y= Convert.ToInt32(Radius*Math.Sin(Angle+120));
Vertex3.X = Convert.ToInt32(Radius*Math.Cos(Angle+240));
Vertex3.Y = Convert.ToInt32(Radius*Math.Sin(Angle+240));
So far, so good; no errors emitted thus far. Now, I don't want users recalculating where the vertices are, so I don't want these members to be public, but I do want them to be able to find them. I first added a 'get' accessor to each of them, but that created an error in the Constructor, telling me that VertexN is not a variable. So I added a group of member functions to read the values, to wit:
public Point GetVertex1
{
return Vertex1;
}
public Point GetVertex2
{
return Vertex2;
}
public Point GetVertex3
{
return Vertex3;
Doing this generated errors that told me that a 'get' or 'set' accessor is required. Obviously I'm missing some important concept here. I thought that a private variable is accessible by all members of a class, and that I should be able to return such a value from a class method that is declared public. Apparently not...
What am I missing here?
"A Journey of a Thousand Rest Stops Begins with a Single Movement"
|
|
|
|
|
Try the following:
private Point _vertex1;
public Point Vertex1
{
get
{
return _vertex1;
}
set
{
_vertex1 = value;
}
}
|
|
|
|
|
Roger Wright wrote: public Point GetVertex1 { return Vertex1; }
As far as the error is concerned, this should fix it for you.
public Point GetVertex1 <br />
{<br />
get { return Vertex1; }<br />
}
Roger Wright wrote: thought that a private variable is accessible by all members of a class
A private variable would be accessible to all members inside a class. However, when you are defining a property, you are basically defining a get / set pair, or a get (for a readonly property). In short, the get / set accessor error is caused because the compiler needs syntax written that way. For some more information, try going through this link[^].
There are only 10 types of people in this world — those who understand binary, and those who don't. |
modified on Sunday, January 3, 2010 4:13 AM
|
|
|
|
|
As mentioned above, you've got an error in the way you're defining the properties.
Another point, the sin and cos functions work in radians not degrees, so I don't think you'll end up with the triangle you're expecting. You need to divide degrees by 180 and multiply by Math.PI to do the conversion.
Regards,
Rob Philpott.
|
|
|
|
|
Rob Philpott wrote: the sin and cos functions work in radians not degrees
They do? I've been using calculators for so many years I never even looked! That makes perfect sense, though, as radian measure is so much more useful for engineering calculations, and I have some future projects in mind that will need it. Thanks for the tip!
"A Journey of a Thousand Rest Stops Begins with a Single Movement"
|
|
|
|
|
Hi again Roger,
Basically, it's easiest to have a private backing field.
private int myValue; In the constructor, take this as a parameter and assign to the field
public MyClassOrStruct(int myValue)
{
this.myValue = myValue;
} Then have a readonly property that returns the field
public int MyValue
{
get { return myValue; }
} In the case of a value that is calculated from other given values (such as Vertex1...), just provide the property and do the calculation in the getter
public int Square
{
get { return myValue * myValue; }
}
Your triangle would now look something like this - I've used your calculations shown so you may need to ammend to include Rob's correction above.
using System;
using System.Drawing;
namespace ShapesLibrary
{
public struct Triangle
{
public static readonly Triangle Empty = new Triangle();
private Point anchor;
private float angle;
private int radius;
public Triangle(Point anchor, Int32 radius, float angle)
{
this.anchor = anchor;
this.angle = angle;
this.radius = radius;
}
public Point Anchor
{
get { return anchor; }
}
public float Angle
{
get { return angle; }
}
public float Radius
{
get { return radius; }
}
public Point Vertex1
{
get
{
return new Point(
(int)(radius * Math.Cos(angle)),
(int)(radius * Math.Sin(angle)));
}
}
public Point Vertex2
{
get
{
return new Point(
(int)(radius * Math.Cos(angle + 120)),
(int)(radius * Math.Sin(angle + 120)));
}
}
public Point Vertex3
{
get
{
return new Point(
(int)(radius * Math.Cos(angle + 240)),
(int)(radius * Math.Sin(angle + 240)));
}
}
}
}
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
DaveyM69 wrote: // Immutable struct
public struct Triangle
What would be the advantage of using a struct here?
There are only 10 types of people in this world — those who understand binary, and those who don't. |
|
|
|
|
|
As a Triangle can never change (if it did - it should be a new triangle!) it makes more sense.
There is a plethora of discussion around on this subject. MSDN on this page[^] says:
"In general, classes are used to model more complex behavior, or data that is intended to be modified after a class object is created. Structs are best suited for small data structures that contain primarily data that is not intended to be modified after the struct is created."
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
oooooh! Contentious!! Are you saying that if we want to spin our triangle around 360 degrees, we need to 'new' a new Triangle up each time?
Regards,
Rob Philpott.
|
|
|
|
|
Good question! This is where the 'generally' part comes in and the accepted statement that structs should always be immutable falls down.
In this particular situation I would possibly say no it shouldn't be a new triangle - and some parts of the struct may need to be mutable (care would have to be taken with implementation of Equals, ==, != and GetHashCode). The Rectangle struct that is used everywhere and it's Inflate method is an example of a struct that behaves like this - it doesn't return a new Rectangle. Your triangle would need to have a Rotate method that behaves in a similar way.
I can feel a long discussion coming on
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
I'm not sure you are right - I feel that a triangle rotated through any angle is technically a new triangle. Unless the angle is a multiple of 360 degrees then the vertices are different, which implies a new triangle. If you make multiples of 360 degrees a special case, then you lead to inconsistant behaviour (at least in terms of memory use) which may throw up problems later on.
I'd be happier with a consistent new struct each time (and it removes special case processing).
All those who believe in psycho kinesis, raise my hand.
|
|
|
|
|
OriginalGriff wrote: triangle rotated through any angle is technically a new triangle
Its the same object, slighty displaced...so why would it be a new triangle?
There are only 10 types of people in this world — those who understand binary, and those who don't. |
|
|
|
|
|
The displacement makes it a new triangle. Take any triangle, draw it on the screen. Rotate it 30 degrees clockwise. Draw it again. Are they the same?
Take the first triangle, rotate it through 50 degrees anti-clockwise. Draw it. Roate the second triangle through 50 degrees antoclockwise. Draw it. Are they the same?
All those who believe in psycho kinesis, raise my hand.
|
|
|
|
|
On reflection - I agree... see my post below[^]
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
This has prompted me to go away and re-research some of my resoning here (always a good thing).
on this page[^] there is some very intersting discussion (including some from some C# gods) about immutable/mutable structs. Eric Lippert says:
"I would never, ever, EVER write a mutable vector or triangle as a struct. A vector is a VALUE. Values do not change. That is every bit as bizarre as writing a "mutable number". Does it make any sense to say, well, I've got the number 12, but I'm going to change this version of 12 to 15? No, of course not. When you add 3 to a number, you get a NEW NUMBER, you don't _modify_ the number 12 to be a different value.
When you change the vertex of a triangle, you have a _different_ triangle, so it should be a different value."
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
Well, I'd argue that Eric Lippert is wrong. Values *do* change. Of course they do. If that were the case then everything would be a struct and we'd never change anything, but just spend our lives copying member data around.
Regards,
Rob Philpott.
|
|
|
|
|
Rob Philpott wrote: Values *do* change
Only if you use FORTRAN...
All those who believe in psycho kinesis, raise my hand.
|
|
|
|
|
int x = 2;
x = 3;
There you are! x change from 2 to 3. And although one could argue that x is a value type and hence has been replaced, that fact is under the covers they'll be a register pointing to a bit of memory with x in it, and when x changes, that pointer won't, the content will. Your stack would get destroyed otherwise.
Regards,
Rob Philpott.
|
|
|
|
|
Yeah but I've used versions of FORTRAN in the past where the following works:
PROGRAM ARRGH
WRITE(*,*) "Seventeen = ", 17
OMG(17)
WRITE(*,*) "Seventeen = ", 17
CONTAINS
SUBROUTINE OMG(INT I)
I = I + 7
RETURN
END SUBROUTINE OMG
END PROGRAM ARRGH
Output:
Seventeen = 17
Seventeen = 24
:bugger to find:
All those who believe in psycho kinesis, raise my hand.
|
|
|
|
|
I'm glad I don't know FORTRAN. Very glad.
Regards,
Rob Philpott.
|
|
|
|
|
Just think VB with compulsary GOTOs.
Second language they taught us at Uni when I started. Straight after COBOL.
They saved "structured" languages like ALGOL for the second year.
Me? I learned Pascal and assembler in my summer industrial training and never looked back.
In practice, they tried hard to update and improve FORTRAN, but the best thing you could do with it was put the poor old girl down. Any language where you could declare a float and use it as a four dimensional array of characters to modify the OS can't be all bad! (And all without pointers or references)
All those who believe in psycho kinesis, raise my hand.
|
|
|
|
|
Variables change, constants do not and values are contants.
x = 1 + 2
1 and 2 are constant - 1 is always 1 and 2 is always 2, x is variable and so can change if different constants are used to calculate it.
It's value, 3, is constant. If we made it
x = 2 + 3
then x has changed, but 3 hasn't... 3 is still 3! x is now mutated to equal a different constant, 5.
Value types (structs) are meant (apparently) to be treated as values and are therefore constant. Variables using our value type can be made to have a different value but not change the actual value.
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|