...not a polymorphic type

Monkey Forums/Monkey Programming/...not a polymorphic type

Xaron(Posted 2012) [#1]
Hi all,

I just try to introduce new classes for the GLFW target but run into some polymorphic trouble.

Here's my class test.cpp
class Test_Bla
{
  static void Blub()
  {
  }
};


Here's the Monkey interface testbla.monkey:
Strict

Private

Import "test.cpp"

Public

Extern

Class Bla = "Test_Bla"
  Method Blub:Void()
End Class


and here's my main code:
Strict

Import mojo
Import testbla

Function Main:Int()
  New TestApp()
  Return 0
End Function

Class TestApp Extends App
  Field testbla:Bla = Null

  Method OnCreate:Int()
    SetUpdateRate(30)
    
    testbla = New Bla()
    Return 0
  End Method

  Method OnUpdate:Int()
    If( KeyHit( KEY_ESCAPE ) )
      Error ""
    End If
    
    Return 0
  End Method
  
  Method OnSuspend:Int()
    Return 0
  End Method
  
  Method OnResume:Int()
    Return 0
  End Method

  Method OnRender:Int()
    Cls
    Return 0
  End Method
End Class


For GLFW this fails compiling with:


(ClCompile target) ->
..\main.cpp(204): error C2683: 'dynamic_cast' : 'Test_Bla' is not a polymorphic type [D:\Projekte\mnet\examples\test.build\glfw\vc2010\MonkeyGame.vcxproj]
..\main.cpp(191): error C2683: 'dynamic_cast' : 'Test_Bla' is not a polymorphic type [D:\Projekte\mnet\examples\test.build\glfw\vc2010\MonkeyGame.vcxproj]



I understand the error message because line 204 of the main.cpp just tries to do a dynamic_cast which obviously doesn't work with a static object:
gc_object *p=dynamic_cast<gc_object*>(rhs);


But... how can I avoid it?

How do you "diddy-guys" handle this for GLFW?


Goodlookinguy(Posted 2012) [#2]
I'd say it's this line
Method Blub:Void()
In your code it's a static method, a.k.a function in monkey.

This will probably fix it, though I've never tested it or imported a function within a class.
Function Blub:Void()


It'd probably be easier to just do this though.

Function Blub:Void() = "Test_Bla::Blub"


Don't mind that last part. Anyways...


Xaron(Posted 2012) [#3]
Yep I know. "Avoiding" the creation of the class it works using something like
Function Blub:Void() = "Test_Bla::Blub"


directly to get access to the static method... But it would be nice to have a real object.

In diddy it's just done via that function solution.


Goodlookinguy(Posted 2012) [#4]
Oh, you know what, looking in monkey/lang.monkey there's some pretty weird stuff going on that might help in finding the answer to this dilemma. Though I can't really say for sure, considering that's part of the core language.


Xaron(Posted 2012) [#5]
rofl, thanks! Will take a look! :)

Class @Object Extends Null="Object"


Ahem.... Alright. *gg*


Xaron(Posted 2012) [#6]
Guess what? That compiles:


Class @Bla Extends Null = "Test_Bla"
  Function Blub:Void()
End Class


Uh oh... now I have to try if it not only compiles but runs as well.


Xaron(Posted 2012) [#7]
Fantastic. Thanks for pointing me to that, Goodlookinguy!

Sockets for GLFW are working now (TCP Server as well as client), yay! Now to Android. :)


Samah(Posted 2012) [#8]
Externed C++ classes need to extend public Object if you want to use any of the Monkey-related stuff (GC, etc.)
class Foo : public Object {
};

This was my experience from porting Lua, at least.


Xaron(Posted 2012) [#9]
Thanks Samah, it works with the code above. Might be some ugly void pointer stuff deriving from Null? LOL.