Estoy implementando un archivo de encabezado «IVideoPlayer.h» y he creado una clase abstracta «IVideoPlayer».

class IVideoPlayer
{

public:
//Initialization
virtual bool Load(const char* pFilePath, bool useSubtitles = false) = 0;
    virtual bool Start() = 0;
    virtual bool Stop() = 0;
    //....
};

Y las funciones que se definen en el archivo «VideoPlayer.cpp»

#include "stdafx.h"
#include "IVideoPlayer.h"
#include <dshow.h>
HRESULT hr = CoInitialize(NULL);
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaEvent   *pEvent = NULL;
class VideoPlayer:public IVideoPlayer
{
public:
bool Load(const char* pFilePath, bool useSubtitles = false)
{
EPlaybackStatus var1 = PBS_ERROR;
//Initialize the COM library.
if (FAILED(hr))
{
printf("ERROR - Could not initialize COM library");
return 0;
}
//Create the filter graph manager and query for interfaces.
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
IID_IGraphBuilder, (void **)&pGraph);
if (FAILED(hr))
{
printf("ERROR - Could not create the Filter Graph Manager.");
return 0;
}
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
//Build the graph. IMPORTANT: Change this string to a file on your system.
hr = pGraph->RenderFile(L"G:\edit.wmv", NULL);
return 0;
}
bool Start()
{
if (SUCCEEDED(hr))
{
//Run the graph.
hr = pControl->Run();
if (SUCCEEDED(hr))
{
//Wait for completion.
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
//Note: Do not use INFINITE in a real application, because it
//can block indefinitely.
}
}
return 0;
}
bool Stop()
{
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
return 0;
}
};

Y para comprobar el archivo de encabezado he creado el archivo sample.cpp

#include "stdafx.h"
#include "IVideoPlayer.h"
#include <stdio.h>
#include <conio.h>
int main(void)
{
VideoPlayer h;
h.Load("G:\hila.wmv");
getch();
return 0;
}

Los errores son:

Error   1 error C2065: 'VideoPlayer' : undeclared identifier    
Error   2 error C2146: syntax error : missing ';' before identifier 'h' 
Error   3 error C2065: 'h' : undeclared identifier  
Error   4 error C2065: 'h' : undeclared identifier  
Error   5 error C2228: left of '.Load' must have class/struct/union 

Por qué compilador está mostrando como undeclared identifier?
Cualquier ayuda es aceptada. Gracias de antemano

  • Por qué escribía using namespace std; si ni siquiera estás usando algo de las bibliotecas de c++?? También esto no debería ser hecho en general!
  • agregar #include «de los recursos.h»
InformationsquelleAutor user3615925 | 2014-05-08

3 Comentarios

  1. 4

    Nunca se incluyen los archivos de encabezado que define la std espacio de nombres, por lo que using que (indefinido) de espacio de nombres de los resultados en un error. Usted también no incluir cualquier encabezado que define la VideoPlayer clase, principalmente porque han decidido poner a la definición de la clase en un archivo de código fuente en lugar de un archivo de encabezado.

    Las anteriores cuentas por los dos primeros errores. El resto de los errores de seguimiento de errores, debido a que el segundo error (VideoPlayer no definido).


    Que usted necesita para hacer un archivo de encabezado donde se coloca la VideoPlayer definición de la clase, como el archivo de encabezado para el IVideoPlayer clase. Poner la implementación de la VideoPlayer funciones miembro en el archivo de origen. A continuación, incluir el archivo de encabezado en el archivo de origen en la que la necesidad VideoPlayer clase.

    • Gracias por la sugerencia. He quitado espacio de nombres y el primer error se ha ido. Pero compilador se sigue mostrando el ensanche de errores. Es debido a que un nombre de archivo de encabezado y relacionadas con el nombre del archivo de origen es diferente?
    • No, es porque definir VideoPlayer en un archivo de origen, en lugar de un encabezado, por lo que no está disponible en otros archivos de origen. Tendrás que mover la definición de la clase en un encabezado, y que incluyen desde main.cpp.
  2. 1

    No hay una definición de nombre std en tu programa, ya que no utiliza ningún estándar de encabezado que contiene la definición de namepsace sexual.
    Al menos cambiar esta directiva

    #include <stdio.h>

    a

    #include <cstdio>

    También tienes que colocar la definición de la clase ‘VideoPlayer en un encabezado y incluir este encabezado en el módulo sample.cpp

  3. 0

    Necesita agregar #include en la parte superior.
    ‘std’ espacio de nombres definido en la biblioteca iostream.
    También es necesario hacer un forward de la declaración de la «Reproductor de Vídeo» de la clase en el archivo cpp principal .

    • De la forma en que lo hace esta respuesta el OP pregunta?
    • ¿Por qué incluir un encabezado usted no necesita simplemente para permitir una directiva using usted no necesita, que no debería estar allí en primer lugar?
    • Tal vez tienes razón. Si no estamos utilizando la funcionalidad proporcionada por ‘std’ espacio de nombres, entonces su no cant. Pero siempre es mejor dejar que el desarrollador sepa lo que es el eslabón perdido que eso es la causa del error. Y en este caso el archivo de encabezado de la inclusión es el eslabón perdido, por lo menos eso es lo que yo pensaba inicialmente. 🙂
    • Es mi respuesta correcta ahora?
    • Necesitarás algo más que una declaración forward si desea crear un objeto. La definición de VideoPlayer necesita ser movido a un encabezado.
    • Yeah right!!. Mi error. Gracias por la corrección de mí.
    • Lo siento, no es mucho mejor …

Dejar respuesta

Please enter your comment!
Please enter your name here