Dios santo, lo que hay que ver. En serio que no tengo ni idea de para qué puede servir eso

.
Las dos primeras líneas son "declaraciones por adelantado" (forward declaration) ya que se van a usar el tipo de dato en la definicion del propio tipo de dato.
Con clases quizás se vea más claro:
Código Delphi
[-]
type A;
type A = class(TObject)
public
Subclase : A;
end;
Si omitimos la declaración por adelantado, el compilador se quejará en la línea:
Subclase : A
porque no se ha terminado de definir el tipo de datos "A" y ya se está haciendo uso de él.
La advertencia sobre "protected" keyword, es que quiere declarar uno de los campos con el nombre "protected" pero eso no está permitido porque es una palabra reservada del propio lenguaje C++, la solución pasa por añadir un guión bajo, de esa forma C++ no lo reconoce como una palabra reservada y puede compilarse.
poquito enrevesado ¿qué no?
Saludos