title: Converting Objective C formatted code to pure C++
body: <p>I've recently started learning programming to make my own 3D OpenGL game on the iPhone and have made reasonably decent progress so far. I started off using the basic OpenGL example that is provided with the iPhone SDK which helped me get off to a good start. However, as I'm starting to get the hang of things, it has occurred to me that I'm unnecessarily programming in Objective C which will make it harder to port the game to other platforms in the future. So I figured that it would be best to make it properly C++ now to avoid lots of extra work later.</p>
  
  <p>To clarify: I'm not actually using any calls to Apple (Objective C) functions or anything, its just that I've based all my clases on the Objective C-style init/dealloc/etc, so that my engine looks like Objective C classes when used. My aim is to replace all the objective C stuff with the C++ equivalents... the trouble is that, being pretty new to C++, I'm not sure what corresponds with what!</p>
  
  <p>Here's a simple example of one of my classes (myLight), in its current Objective C incarnation:</p>
  
  <pre><code>//  myLight.h
  
  #import &lt;OpenGLES/EAGL.h&gt;
  #import &lt;OpenGLES/ES1/gl.h&gt;
  #import &lt;OpenGLES/ES1/glext.h&gt;
  
  @interface myLight : NSObject {
      char *name;
      GLfloat *ambient, *diffuse, *specular, *position, *spotDirection;
      GLfloat spotRadius;
  
      GLfloat *matAmbient, *matDiffuse, *matSpecular;
      GLfloat shininess;
      Byte lightType;
  }
  @property (readonly) char *name;
  @property (assign) GLfloat *position;
  @property (assign) GLfloat *spotDirection;
  
  @property (assign) GLfloat *ambient;
  @property (assign) GLfloat *diffuse;
  @property (assign) GLfloat *specular;
  
  - (id)initWithContentsFromDatastream:(NSData *)fileData;
  - (void)set;
  
  @end
  </code></pre>
  
  <p>And the corresponding .mm file:</p>
  
  <pre><code>//  myLight.m
  
  #import "myLight.h"
  
  @implementation myLight
  @synthesize name, ambient, diffuse, specular, position, spotDirection;
  
  - (id)initWithContentsFromDatastream:(NSData *)fileData {
      self = [super init];
      NSData *fileContents = fileData;
      uint ptr = 0;
  
      Byte nameLength;
      [fileContents getBytes:&amp;nameLength range: NSMakeRange(ptr, sizeof(Byte))];
      ptr++;
  
      name = new char[nameLength];
      [fileContents getBytes:name range: NSMakeRange(ptr, (nameLength * sizeof(char)) )];
      ptr = ptr + (nameLength * sizeof(char) );
  
      [fileContents getBytes:&amp;lightType range: NSMakeRange(ptr, sizeof(Byte))];
      ptr++;
  
      position = new GLfloat[4];
      for(int j = 0; j &lt; (4); j++)
          [fileContents getBytes:&amp;position[j] range: NSMakeRange( (j* sizeof(float) ) + ptr, sizeof(float))];
      ptr = ptr + (4 * sizeof(float));
  
      if(lightType==2){
          spotDirection = new GLfloat[3];
          for(int j = 0; j &lt; (3); j++)
              [fileContents getBytes:&amp;spotDirection[j] range: NSMakeRange( (j* sizeof(float) ) + ptr, sizeof(float))];
          ptr = ptr + (3 * sizeof(float));
  
          [fileContents getBytes:&amp;spotRadius range: NSMakeRange(ptr, sizeof(float))];
          ptr = ptr + sizeof(float);
      } else 
          spotDirection = NULL;
  
      diffuse = new GLfloat[4];
      for(int j = 0; j &lt; (4); j++)
          [fileContents getBytes:&amp;diffuse[j] range: NSMakeRange( (j* sizeof(float) ) + ptr, sizeof(float))];
      ptr = ptr + (4 * sizeof(float));
  
      ambient = new GLfloat[4];
      for(int j = 0; j &lt; (4); j++)
          [fileContents getBytes:&amp;ambient[j] range: NSMakeRange( (j* sizeof(float) ) + ptr, sizeof(float))];
      ptr = ptr + (4 * sizeof(float));
  
      specular = new GLfloat[4];
      for(int j = 0; j &lt; (4); j++)
          [fileContents getBytes:&amp;specular[j] range: NSMakeRange( (j* sizeof(float) ) + ptr, sizeof(float))];
      ptr = ptr + (4 * sizeof(float));
  
      [self set];
  
    return self;
  }
  
  - (void)set{
      glEnable(GL_LIGHTING);
      glEnable(GL_LIGHT0);
      glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
      glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
      glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
      glLightfv(GL_LIGHT0, GL_POSITION, position);
  
      if(lightType==2)
          glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spotDirection);
  }
  
  - (void)dealloc {
      delete[] specular;
      delete[] ambient;
      delete[] diffuse;
  
      if (spotDirection)
          delete[] spotDirection;
  
      delete[] position;
      delete[] name;
  
      [super dealloc];
  }
  
  @end
  </code></pre>
  
  <p>If someone could point out which lines need to be changed and, more importantly, what they should be changed to to make it compile as pure C++, I'd really appreciate it.</p>
  
  <p>Many Thanks!</p>