Forward declaration
BlitzMax Forums/BlitzMax Beginners Area/Forward declaration
| ||
Is there no way to make forward declaration in BlitzMax? i.e., something like: 'BEGIN CODE: Type thingy Function dothis(that, what) Function dothat(hut, hat) End Type Function thingy.dothis(that, what) ' Some code End Function Function thingy.dothat(hut, hat) ' Some other code End Function 'END CODE I'm asking because I run into problems with the order of my functions descriptions. Function A is declared before function B and function A uses function B, so I get an error... (Oh, and where can I find the specifications for the codes used in this forum for inserting screenshots and code boxes and stuff?) |
| ||
You can't define functions within Types like that. Your example should be...Type thingy Function dothis(that,what) ' some code End Function Function dothat(hut,hat) ' some other code End Function End Type You then call them with thingy.dothis(1,2), etc. The general order of things doesn't really matter (I think), as BlitzMax uses a multi-pass compiler. As for the forum codes, I don't know where they are, but here are the ones used most (replace {} with []). {code} Your code {/code} {img}http://www.image_url.com{/img} - ignore dodgy link! {a http://www.url.com}some text for your link{/a} - ignore dodgy link! {b}bold text{/b} Hope that helps. |
| ||
I think the keyword you're looking for is Abstract. But Jazz is right, you can't define functions like in your example, and the order in which functions are declared is not important. Type someType Function doThis() doThat EndFunction Function doThat() Print "Done that" EndFunction EndType someType.doThis |
| ||
To both of you: I know that BlitzMax wants the function definitions inside the type declarations - I just wish there was a way to forward declare functions like you do in C. But I guess BlitzMax just can't do that :( |
| ||
But I guess BlitzMax just can't do that :( Which part of "I think the keyword you're looking for is Abstract" don't you understand?But it's nonsensical in BlitzMAX unless you're dealing with polymorphism, because in BlitzMAX (as opposed to C, which uses a single-pass compiler) "the order in which functions are declared is not important". |
| ||
I think I'll drop my original question (since it's answered now :) thankyou all). But I have a related question - What am I doing wrong here: Type THouse Function Create() Self.MakeRoof End Function Method MakeRoof() 'Some code End Method End Type The error I get is when calling Self.MakeRoof; "Identifier 'MakeRoof' not found". |
| ||
Function is on Typebase But method is on Instancebase. you need to do local t:THouse = new THouse t.MakeRoof return t |
| ||
AH! I see! So if I make MakeRoof a function instead, it should just work... Trying that... Yep it worked! Thanks everybody! |
| ||
Man, this is annoying... BlitzMax is so strict with Fields and methods being instancebased and functions and globals being typebased, so I can't make completely self-contained objects which, for example, initialize themselves upon creation? Or maybe I'm going about this the wrong way? Maybe I shouldn't use the Create function but the New method instead... Would that work...? I guess I'm just typing while thinking here - I can't be the only one with this problem... |
| ||
For creation functionality without parameters, you can use new and override method new () with you own initialisation. For a create with parameters, you can create a function that returns an instance of the type and sets the specific values. (the general initialisation should still be done in new) |
| ||
Yes, but the Create function can't set the values in a Field, right? So if I want an object to be initialized with parameters upon creation... it just can't be done. I need to make a new object and the call some initialization method which sets the field values.... I'm sorry, I must be really confusing here... Let me make an example of what it is I want: I want to create an object type like a house; And this house object takes a couple of parameters during creation, like roofheight and number of doors, and then it calculates, say, a threedimensional house model and stores the created vertices in some fields. And I just want to type something like "AHouse:THouse = new Thouse(roofheight, doorcount)" for all this to happen... |
| ||
Once you've created the instance in your Create function, you can set the fields and call the methods on it, i.e.:Type THouse Field Floors:Int Function Create:THouse() Local tmpHouse:THouse=New THouse tmpHouse.Floors=2 tmpHouse.MakeRoof Return tmpHouse End Function Method MakeRoof() 'Some code End Method End Type |
| ||
Type rect Field x,y,w,h Field area Function Create:rect(sx,sy,sw,sh) Local r:rect=New rect r.x = sx r.y = sy r.w = sw r.h = sh r.area = sw*sh Return r EndFunction EndType Global block:rect=block.Create(10,10,250,120) You can have a Create function that initialises the fields. You just need to make sure you're accessing them correctly. Basically, Functions allow you to access all instances of a Type, for example when updating them or drawing them all. And Methods allow you to alter one particular instance. EDIT: Ok, beaten to it! |
| ||
You can declare default values for fields right there in the type:Type Oink Field baa = 1 End Type |
| ||
A thing of beauty. I didn't know that... |
| ||
Thankyou everyone! Most of my programming experience is with Delphi and most recently C/C++, so I got a bit confused there. Thanks for clearing all this up for me - now I can really get started on my game. |