Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    81

    [c++]Problemi con funzioni membro

    Ciao a tutti, ho il seguente problema, sto eseguendo un progetto in visual c++ 2008 express edition. Ho aggiunto il metodo stampa() in SAXPrintHandler.hpp:
    codice:
    #include <xercesc/sax/HandlerBase.hpp>
    #include <xercesc/framework/XMLFormatter.hpp>
    #include <vector>
    
    using namespace std;
    XERCES_CPP_NAMESPACE_USE
    
    class SAXPrintHandlers : public HandlerBase, private XMLFormatTarget
    {
    public:
        // -----------------------------------------------------------------------
        //  Constructors
        // -----------------------------------------------------------------------
        SAXPrintHandlers
        (
            const   char* const                 encodingName
            , const XMLFormatter::UnRepFlags    unRepFlags
        );
        ~SAXPrintHandlers();
    
    
        
    
    	//Metodo creato per la stampa dei dati inseriti nel vettore
    	
    	void stampaStack();
    
    	public : struct PathData {
    		wstring element;
    		wstring elementText;
    			 };
    	//}elem;
    	vector<PathData> pathdata;
    
    };
    L'ho poi implementato in SAXPrintHandler.cpp:
    codice:
    #include "stdafx.h"
    #include <xercesc/util/XMLUniDefs.hpp>
    #include <xercesc/sax/AttributeList.hpp>
    #include "SAXPrint.hpp"
    
    ..........................
    
    void SAXPrintHandlers::startDocument()
    {
    }
    void SAXPrintHandlers::stampaStack()
    {
    	int len = pathdata.size();
    	for (int index = 0; index < len; index++){
    		PathData elem = pathdata[index];
    		cout<<"Elemento: "<< StrX(elem.element.data())<<"\n";
    		cout<<"Elemento Text: "<< StrX(elem.elementText.data())<<"\n";
    		cout<<"------------------------------------------------------\n";
    	}
    	
    }
    
    void SAXPrintHandlers::startElement(const   XMLCh* const    name
                                        ,       AttributeList&  attributes)
    {
    	SAXPrintHandlers::PathData elem;
    	elem.element=name;
    	pathdata.push_back(elem);
    	XERCES_STD_QUALIFIER cout << pathdata.size()<<"\n";
    	cout <<StrX(elem.element.data())<< "\n";
        // The name has to be representable without any escapes
        //fFormatter  << XMLFormatter::NoEscapes
               //     << chOpenAngle << name;
    
        XMLSize_t len = attributes.getLength();
        for (XMLSize_t index = 0; index < len; index++)
        {
    		SAXPrintHandlers::PathData p;
    		p.element=attributes.getName(index);
    		pathdata.push_back(p);
    		cout <<"Attributo: "<<StrX(p.element.data())<< "\n";
    		cout<<"Valore: "<<StrX(attributes.getValue(index))<< "\n";
            //
            //  Again the name has to be completely representable. But the
            //  attribute can have refs and requires the attribute style
            //  escaping.
            //
          /*  fFormatter  << XMLFormatter::NoEscapes
                        << chSpace << attributes.getName(index)
                        << chEqual << chDoubleQuote
                        << XMLFormatter::AttrEscapes
    		            << attributes.getValue(index)
                        << XMLFormatter::NoEscapes
                        << chDoubleQuote;
        }
        fFormatter << chCloseAngle;*/
    	}
    		
    };
    Io vorrei chiamare il metodo stampa nella classe main del mio progetto ossia progettoSax.cpp che è la seguente:
    codice:
    #include "stdafx.h"
    #include <xercesc/util/PlatformUtils.hpp>
    #include <xercesc/util/TransService.hpp>
    #include <xercesc/parsers/SAXParser.hpp>
    #include "SAXPrint.hpp"
    //#include "SAXPrintHandlers.hpp"
    #include <xercesc/util/OutOfMemoryException.hpp>
    //#include <vector>
    
    //using namespace std;
    
    // ---------------------------------------------------------------------------
    //  Local data
    //
    //  doNamespaces
    //      Indicates whether namespace processing should be enabled or not.
    //      Defaults to disabled.
    //
    //  doSchema
    //      Indicates whether schema processing should be enabled or not.
    //      Defaults to disabled.
    //
    //  schemaFullChecking
    //      Indicates whether full schema constraint checking should be enabled or not.
    //      Defaults to disabled.
    //
    //  encodingName
    //      The encoding we are to output in. If not set on the command line,
    //      then it is defaulted to LATIN1.
    //
    //  xmlFile
    //      The path to the file to parser. Set via command line.
    //
    //  valScheme
    //      Indicates what validation scheme to use. It defaults to 'auto', but
    //      can be set via the -v= command.
    // ---------------------------------------------------------------------------
    static bool                     doNamespaces        = false;
    static bool                     doSchema            = false;
    static bool                     schemaFullChecking  = false;
    static const char*              encodingName    = "LATIN1";
    static XMLFormatter::UnRepFlags unRepFlags      = XMLFormatter::UnRep_CharRef;
    static char*                    xmlFile         = 0;
    static SAXParser::ValSchemes    valScheme       = SAXParser::Val_Auto;
    
    
    
    // ---------------------------------------------------------------------------
    //  Local helper methods
    // ---------------------------------------------------------------------------
    static void usage()
    {
        XERCES_STD_QUALIFIER cout << "\nUsage:\n"
                "    SAXPrint [options] <XML file>\n\n"
                "This program invokes the SAX Parser, and then prints the\n"
                "data returned by the various SAX handlers for the specified\n"
                "XML file.\n\n"
                "Options:\n"
                 "    -u=xxx      Handle unrepresentable chars [fail | rep | ref*].\n"
                 "    -v=xxx      Validation scheme [always | never | auto*].\n"
                 "    -n          Enable namespace processing.\n"
                 "    -s          Enable schema processing.\n"
                 "    -f          Enable full schema constraint checking.\n"
                 "    -x=XXX      Use a particular encoding for output (LATIN1*).\n"
                 "    -?          Show this help.\n\n"
                 "  * = Default if not provided explicitly.\n\n"
                 "The parser has intrinsic support for the following encodings:\n"
                 "    UTF-8, US-ASCII, ISO8859-1, UTF-16[BL]E, UCS-4[BL]E,\n"
                 "    WINDOWS-1252, IBM1140, IBM037, IBM1047.\n"
             <<  XERCES_STD_QUALIFIER endl;
    }
    
    
    
    // ---------------------------------------------------------------------------
    //  Program entry point
    // ---------------------------------------------------------------------------
    int main(int argC, char* argV[])
    {
        // Initialize the XML4C2 system
        try
        {
             XMLPlatformUtils::Initialize();
        }
    
        catch (const XMLException& toCatch)
        {
             XERCES_STD_QUALIFIER cerr << "Error during initialization! :\n"
                  << StrX(toCatch.getMessage()) << XERCES_STD_QUALIFIER endl;
             return 1;
        }
    
        // Check command line and extract arguments.
        if (argC < 2)
        {
            usage();
            XMLPlatformUtils::Terminate();
            return 1;
        }
    
        int parmInd;
        for (parmInd = 1; parmInd < argC; parmInd++)
        {
            // Break out on first parm not starting with a dash
            if (argV[parmInd][0] != '-')
                break;
    
            // Watch for special case help request
            if (!strcmp(argV[parmInd], "-?"))
            {
                usage();
                XMLPlatformUtils::Terminate();
                return 2;
            }
             else if (!strncmp(argV[parmInd], "-v=", 3)
                  ||  !strncmp(argV[parmInd], "-V=", 3))
            {
                const char* const parm = &argV[parmInd][3];
    
                if (!strcmp(parm, "never"))
                    valScheme = SAXParser::Val_Never;
                else if (!strcmp(parm, "auto"))
                    valScheme = SAXParser::Val_Auto;
                else if (!strcmp(parm, "always"))
                    valScheme = SAXParser::Val_Always;
                else
                {
                    XERCES_STD_QUALIFIER cerr << "Unknown -v= value: " << parm << XERCES_STD_QUALIFIER endl;
                    XMLPlatformUtils::Terminate();
                    return 2;
                }
            }
             else if (!strcmp(argV[parmInd], "-n")
                  ||  !strcmp(argV[parmInd], "-N"))
            {
                doNamespaces = true;
            }
             else if (!strcmp(argV[parmInd], "-s")
                  ||  !strcmp(argV[parmInd], "-S"))
            {
                doSchema = true;
            }
             else if (!strcmp(argV[parmInd], "-f")
                  ||  !strcmp(argV[parmInd], "-F"))
            {
                schemaFullChecking = true;
            }
             else if (!strncmp(argV[parmInd], "-x=", 3)
                  ||  !strncmp(argV[parmInd], "-X=", 3))
            {
                // Get out the encoding name
                encodingName = &argV[parmInd][3];
            }
             else if (!strncmp(argV[parmInd], "-u=", 3)
                  ||  !strncmp(argV[parmInd], "-U=", 3))
            {
                const char* const parm = &argV[parmInd][3];
    
                if (!strcmp(parm, "fail"))
                    unRepFlags = XMLFormatter::UnRep_Fail;
                else if (!strcmp(parm, "rep"))
                    unRepFlags = XMLFormatter::UnRep_Replace;
                else if (!strcmp(parm, "ref"))
                    unRepFlags = XMLFormatter::UnRep_CharRef;
                else
                {
                    XERCES_STD_QUALIFIER cerr << "Unknown -u= value: " << parm << XERCES_STD_QUALIFIER endl;
                    XMLPlatformUtils::Terminate();
                    return 2;
                }
            }
             else
            {
                XERCES_STD_QUALIFIER cerr << "Unknown option '" << argV[parmInd]
                     << "', ignoring it\n" << XERCES_STD_QUALIFIER endl;
            }
        }
    
        //
        //  And now we have to have only one parameter left and it must be
        //  the file name.
        //
        if (parmInd + 1 != argC)
        {
            usage();
            XMLPlatformUtils::Terminate();
            return 1;
        }
        xmlFile = argV[parmInd];
        int errorCount = 0;
    
        //
        //  Create a SAX parser object. Then, according to what we were told on
        //  the command line, set it to validate or not.
        //
        SAXParser* parser = new SAXParser;
        parser->setValidationScheme(valScheme);
        parser->setDoNamespaces(doNamespaces);
        parser->setDoSchema(doSchema);
        parser->setHandleMultipleImports (true);
        parser->setValidationSchemaFullChecking(schemaFullChecking);
    	//SAXPrintHandlers sax;
    	//sax.stampaStack();
        //
        //  Create the handler object and install it as the document and error
        //  handler for the parser-> Then parse the file and catch any exceptions
        //  that propogate out
        //
        int errorCode = 0;
        try
        {
            SAXPrintHandlers handler(encodingName, unRepFlags);
            parser->setDocumentHandler(&handler);
            parser->setErrorHandler(&handler);
            parser->parse(xmlFile);
            errorCount = parser->getErrorCount();
    		
        }
        catch (const OutOfMemoryException&)
        {
            XERCES_STD_QUALIFIER cerr << "OutOfMemoryException" << XERCES_STD_QUALIFIER endl;
            errorCode = 5;
        }
        catch (const XMLException& toCatch)
        {
            XERCES_STD_QUALIFIER cerr << "\nAn error occurred\n  Error: "
                 << StrX(toCatch.getMessage())
                 << "\n" << XERCES_STD_QUALIFIER endl;
            errorCode = 4;
        }
        if(errorCode) {
            XMLPlatformUtils::Terminate();
            return errorCode;
        }
    
        //
        //  Delete the parser itself.  Must be done prior to calling Terminate, below.
        //
        delete parser;
    
        // And call the termination method
        XMLPlatformUtils::Terminate();
    	
    
        if (errorCount > 0)
            return 4;
        else
            return 0;
    }
    Ma se scrivo la seguente linea di codice:
    codice:
    SAXPrintHandlers::stampaStack();
    mi da il seguente errore:

    'stampaStack': non è un membro di 'SAXPrintHandlers'

    Ho provato a mettere nelle import ma mi solleva troppi errori. Avete un'idea su come risolvere il problema. Per problemi di caratteri a disposizione non ho messo tutto il codice se avete bisogno lo invio in più messaggi. Grazie......

  2. #2
    Ciao, non ho guardato tutto il codice perchè è troppo lungo (quando posti sul forum, taglia via le parti inutili, come metodi che non c'entrano nulla con il problema e commenti riguardanti altro, se non intendi scoraggiare chi vuole aiutarti), però guardando questo

    codice:
    SAXPrintHandlers::stampaStack();
    direi che stai cercando di richiamare un metodo che non è static. Hai bisogno di un'istanza di SAXPrintHandlers per richiamarlo.

    Non so dirti se è quello il problema però.


  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    81
    Avevi ragione il problema era quello..mi ha ingannato il fatto che l'intellisense non mi dava suggerimenti, pensavo non vedesse il metodo..ora funziona...grazieeee

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.