Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Borito30 en 1 Marzo 2017, 04:17 am



Título: No puedo declarar la variable por ser un tipo abstracto
Publicado por: Borito30 en 1 Marzo 2017, 04:17 am
Estoy creando una clase basada en la libreria gloox pero cuando creo un miembro de mi clase me devuelve el siguiente error:
Código:
error: cannot declare variable 'b' to be of abstract type 'Bot'|

Código:
#include "gloox/src/client.h"
#include "gloox/src/messagehandler.h"
#include "gloox/src/message.h"
#include "gloox/src/presencehandler.h"
#include "gloox/src/connectionlistener.h"
#include <ctime>
#include <iostream>
#include <string>
using namespace std;
using namespace gloox;
//my one
const string LOGIN = "gmail.com";
ostream& operator<<(ostream& os, Message::MessageType type) {
    switch (type) {
        case Message::Chat:
            os << "Chat";
            break;
        case Message::Error:
            os << "Error";
            break;
        case Message::Groupchat:
            os << "Groupchat";
            break;
        case Message::Headline:
            os << "Headline";
            break;
        case Message::Normal:
            os << "Normal";
            break;
        case Message::Invalid:
            os << "Invalid";
            break;
        default:
            os << "unknown type";
            break;
    }
return os;
}

ostream& operator<<(ostream& os, const Message& stanza) {
    os << "type:'" << stanza.subtype() <<  "' from:'" << stanza.from().full() << "' body:'" << stanza.body() << "'";
    return os;
}

class Bot : public MessageHandler,
            /*public PresenceHandler,*/
            public ConnectionListener
            /*,public RosterListener*/{
 public:
   Bot(){
      JID jid( "mmaaria123@gmail.com/home" );
      client = new Client( jid, "mmaaria123" );
      client->registerConnectionListener( this );
      client->registerMessageHandler( this );
      client->connect(true);
   }

    virtual void onConnect() {
        cout << "It is connected good:)"  << endl;
        //sleep(5);
        client->disconnect();
    }

    virtual void onDisconnect(ConnectionError e) {
        cout << "ConnListener::onDisconnect() " << endl;
    }
/*
    virtual bool onTLSConnect(const CertInfo& Info) {

       time_t tm = Info.date_from;
       time_t tm_to = Info.date_to;
       cout << "\t Certificate information to " << LOGIN << endl;
       cout << "\t========================================" << endl;
      // number code << "\tServer status: " << Info.status;
        if (Info.status !=0)
            {
            cout << "\t !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
            cout << "\t !!!  The certificate has a problem !!!" << endl;
            cout << "\t !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
            // parsing binary Status Cert
            if ((CertInvalid) & Info.status)
                {
                    cout << "\t- The certificate is not trusted " << endl;
                }
            if (( CertSignerUnknown) & Info.status)
                {
                    cout << "\t- The certificate hasn't got a kown issuer" << endl;
                }
            if ((CertRevoked) & Info.status)
                {
                    cout << "\t- The certificate has been revoked " << endl;
                }
            if ((CertExpired) & Info.status)
                {
                    cout << "\t- The certificate has expired " << endl;
                }
            if ((CertNotActive) & Info.status)
                {
                    cout << "\t- The certificate is not yet active " << endl;
                }
            if ((CertWrongPeer) & Info.status)
                {
                    cout << "\t- The certificate has not issued for the peer we're connected to " << endl;
                }
            if ((CertSignerNotCa) & Info.status)
                {
                    cout << "\t- The signer is not CA " << endl;
                }
            cout << endl;
            }
            // end parsing
        else
            // if Info.status=0 sertificate is valide
            cout << " *** Cert is OK!" << endl;

       cout << "\tChain: " << Info.chain << endl;
       cout << "\tIssuer: " << Info.issuer << endl;
       cout << "\tServer: " << Info.server << endl;
       cout << "\tCert date from: " << ctime(&tm);
       cout << "\tCert date to: " << ctime(&tm_to);
       cout << "\tProtocol: " << Info.protocol << endl;
       cout << "\tCipher: " << Info.cipher << endl;
       cout << "\tMAC: " << Info.mac << endl;
       cout << "\tCompression: " << Info.compression << endl;
       cout << "\t========================================" << endl;
     return true;

    }
*/
   virtual void handleMessage( const Message& stanza,
                               MessageSession* session = 0 ){
     Message msg(Message::Chat, stanza.from(), "hello world" );
     client->send( msg );
   }

 private:
   Client* client;
};

int main(){
    cout << "1" << endl;
    Bot b;
}


Título: Re: No puedo declarar la variable por ser un tipo abstracto
Publicado por: ivancea96 en 1 Marzo 2017, 12:48 pm
No conozco la librería pero dado que la clase hereda de esas otras clases, será que hay miembros que no has definido. Por ejemplo, virtual bool onTLSConnect(const CertInfo& Info), que lo tienes comentado. Quizás sea una función virtual pura.

EDITO: Quizás no. Es una función virtual pura, según lo que vi en la referencia de la librería. https://camaya.net/api/gloox/classgloox_1_1ConnectionListener.html (https://camaya.net/api/gloox/classgloox_1_1ConnectionListener.html)


Título: Re: No puedo declarar la variable por ser un tipo abstracto
Publicado por: Borito30 en 1 Marzo 2017, 12:50 pm
No conozco la librería pero dado que la clase hereda de esas otras clases, será que hay miembros que no has definido. Por ejemplo, virtual bool onTLSConnect(const CertInfo& Info), que lo tienes comentado. Quizás sea una función virtual pura.
tengo que incluir openssl para poder usarlo pero hasta tiempo que no lo hago y nunca lo he hecho en codeblocks como podría incluir las librerías openssl para solucionar este error en codeblocks?


Título: Re: No puedo declarar la variable por ser un tipo abstracto
Publicado por: ivancea96 en 1 Marzo 2017, 13:39 pm
Primero, descargala. Si laquieres ya compilada, puedes probar desde auí: https://wiki.openssl.org/index.php/Binaries (https://wiki.openssl.org/index.php/Binaries)

Luego, toca poner las opciones de Code::Blocks. Te pongo como lo tengo yo para que te orientes:

(http://i.gyazo.com/5b382797757556469ffb97098634bbb4.png)

(http://i.gyazo.com/36d37ffb6e5663226a06157f03ff4af8.png)

(http://i.gyazo.com/e1d86399c10a12e67dc51fad162d8e8e.png)


Título: Re: No puedo declarar la variable por ser un tipo abstracto
Publicado por: Borito30 en 12 Marzo 2017, 16:16 pm
Una pregunta ya puedo usar openssl pero porque cuando el siguiente ejemplo pongo una cabecera de openssl ej:
Código:
#include <iostream>
#include <aes.h>
using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    return 0;
}
Incluyo esta cabecera:
Código:
#include <aes.h>
Me devuelve este error gracias por su ayuda:
Código:
||=== Build: Debug in main (compiler: GNU GCC Compiler) ===|
C:\openssl-1.0.1c_static_w32_mingw\include\openssl\aes.h|55|fatal error: openssl/opensslconf.h: No such file or directory|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|


Título: Re: No puedo declarar la variable por ser un tipo abstracto
Publicado por: ivancea96 en 12 Marzo 2017, 16:33 pm
El error es auto-explicativo. Esa cabecera tiene un include dentro que parece no existir.
Mira el código de la cabecera, mira e include, y mira si existe. Si existe, tal vez hayas puesto algo mal en la configuración del IDE al compilar.

Aunque bueno, alerta spoiler:
Probablemente pusiste que el directorio de los includes es "include/openssl". Eso es incorrecto. El directorio de los include es "include", sin más.
Para incluir cabeceras de OpenSSL, tienes que poner "#include <openssl/...>". Por ejemplo, #include <openssl/aes.h>

Si ves el código de la cabecera del error, verás que tiene un: #include <openssl/opensslconf.h>


Título: Re: No puedo declarar la variable por ser un tipo abstracto
Publicado por: Borito30 en 12 Marzo 2017, 16:46 pm
Este es el error que me aparece en mingw:
Código:
||=== Build: Debug in main (compiler: GNU GCC Compiler) ===|
C:\openssl-1.0.1c_static_w32_mingw\include\openssl\aes.h|55|fatal error: openssl/opensslconf.h: No such file or directory|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|


Título: Re: No puedo declarar la variable por ser un tipo abstracto
Publicado por: ivancea96 en 12 Marzo 2017, 17:28 pm
En VS, click derecho en el proyecto, propiedades.
Ahí tienes, dentor de "Configuration properties", la pestaña "C/C++ -> General". Dentro de esta, Additional include directories.

Luego, para el linker, si el proyecto se va a linkear, debajo de "C/C++", tienes "Linker". Ene sta, teines "General" también. Ahí, "Additional library dependencies". Luego, en "Linker -> Input", tienes "Additional dependencies".


Título: Re: No puedo declarar la variable por ser un tipo abstracto
Publicado por: Borito30 en 12 Marzo 2017, 17:35 pm
El error es auto-explicativo. Esa cabecera tiene un include dentro que parece no existir.
Mira el código de la cabecera, mira e include, y mira si existe. Si existe, tal vez hayas puesto algo mal en la configuración del IDE al compilar.

Aunque bueno, alerta spoiler:
Probablemente pusiste que el directorio de los includes es "include/openssl". Eso es incorrecto. El directorio de los include es "include", sin más.
Para incluir cabeceras de OpenSSL, tienes que poner "#include <openssl/...>". Por ejemplo, #include <openssl/aes.h>

Si ves el código de la cabecera del error, verás que tiene un: #include <openssl/opensslconf.h>

Pero si esque te fijas yo tengo las cabeceras dentro del directorio openssl que esta dentro del directorio include por eso puse esa ruta o estaría mal? Gracias!


Título: Re: No puedo declarar la variable por ser un tipo abstracto
Publicado por: ivancea96 en 12 Marzo 2017, 17:39 pm
En directorio de includes, debes poner "include", no "include/openssl". Sí, las cabeceras están en "include/openssl", pero accedes a ellas poniendo #include <openssl/aes.h>.
Esto se hace o para diferenciar diferentes librerías que puedan tener cabeceras con el mismo nombre, o separar en carpetas, sin más. En cualquier caso, y de forma general, siempre pondrás como directorio "include", y no la carpeta que pueda tener dentro. Además, en este caso estás casi obligado, ya que las propias cabeceras utilizan la fórmula #include <openssl/aes.h>.


Título: Re: No puedo declarar la variable por ser un tipo abstracto
Publicado por: Borito30 en 12 Marzo 2017, 17:52 pm
En directorio de includes, debes poner "include", no "include/openssl". Sí, las cabeceras están en "include/openssl", pero accedes a ellas poniendo #include <openssl/aes.h>.
Esto se hace o para diferenciar diferentes librerías que puedan tener cabeceras con el mismo nombre, o separar en carpetas, sin más. En cualquier caso, y de forma general, siempre pondrás como directorio "include", y no la carpeta que pueda tener dentro. Además, en este caso estás casi obligado, ya que las propias cabeceras utilizan la fórmula #include <openssl/aes.h>.
Vale ahora lo entendi que tengo que poner en search directories compiler la ruta include es decir C:\openssl-1.0.1c_static_w32_mingw\include para que me coja openssl/cabecera.h solo que en mi proyecto tendre que indicarlo de esta manera:
Código:
#include <openssl/aes.h>
Ahora me queda mucho más claro. Revisare en visual y te comento me resolvistes el problema gracias.


Título: Re: No puedo declarar la variable por ser un tipo abstracto
Publicado por: Borito30 en 12 Marzo 2017, 19:00 pm
En VS, click derecho en el proyecto, propiedades.
Ahí tienes, dentor de "Configuration properties", la pestaña "C/C++ -> General". Dentro de esta, Additional include directories.

Luego, para el linker, si el proyecto se va a linkear, debajo de "C/C++", tienes "Linker". Ene sta, teines "General" también. Ahí, "Additional library dependencies". Luego, en "Linker -> Input", tienes "Additional dependencies".
Vale en visual studio lo inclui asi:
(https://i.imgsafe.org/58c79f0fb9.png)
(https://i.imgsafe.org/590180d166.png)
Pero me devuelve el siguiente error:
Código:
Error	30	error LNK1181: no se puede abrir el archivo de entrada 'ssleay32'	C:\Users\moh\Desktop\gloox\LINK	gloox-1.0
Y apunta aqui:
Código:
#include <openssl/sha.h>
Pero lo apunte como me dijistes poniendo solamente include no se el motivo de este error. Gracias por tu ayuda!


Título: Re: No puedo declarar la variable por ser un tipo abstracto
Publicado por: ivancea96 en 12 Marzo 2017, 19:20 pm
No en using, en inclusión. Directorios de inclusión.


Título: Re: No puedo declarar la variable por ser un tipo abstracto
Publicado por: Borito30 en 12 Marzo 2017, 19:30 pm
funciono gracias


Título: Re: No puedo declarar la variable por ser un tipo abstracto
Publicado por: Borito30 en 14 Marzo 2017, 13:49 pm
abri otro post ya que este es antiguo y no lo puedo poner otra vez para resolverlo