Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Probleme mit mutable und gcc

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.09.2003, 11:08 Uhr
virtual
Sexiest Bit alive
(Operator)


Nachdem im 47. Virtualrästel ~wissender eine Erweiterung angeregt hat, habe ich diese eingebaut:

C++:
#include <string>
#include <iostream>
#include <algorithm>
#include <stdexcept>

class StringTokenizer
{
private:
    std::string m_strText;
    std::string::size_type m_nTokenized;
    std::string m_strDelimiter;
    mutable int m_nCount;

public:
    StringTokenizer(
        const char* p_szText,
        char p_cDelimiter)
        :m_strText(p_szText), m_nTokenized(0),
         m_strDelimiter(std::string(1, p_cDelimiter)), m_nCount(-1)
    {
    }

    StringTokenizer(
        const std::string& p_strText,
        char p_cDelimiter)
        :m_strText(p_strText), m_nTokenized(0),
         m_strDelimiter(std::string(1, p_cDelimiter)), m_nCount(-1)
    {
    }

    StringTokenizer(
        const std::string& p_strText,
        const std::string& p_strDelimiter)
        :m_strText(p_strText), m_nTokenized(0),
         m_strDelimiter(p_strDelimiter), m_nCount(-1)
    {
    }

    bool hasMoreTokens() const
    {
        return countTokens()>0;
    }          
                
    int countTokens() const
    {          
        if (-1 == m_nCount)
        {
            if (std::string::npos!=m_nTokenized)
            {
                m_nCount = 0;
                std::string::size_type i = m_nTokenized;
                while (std::string::npos!=i)
                {
                    i = m_strText.find_first_of(m_strDelimiter, i);
                    if (std::string::npos!=i) ++i;
                    ++m_nCount;
                }
std::cout<<m_nCount<<std::endl; // ??? BUG ???
            }else
            {
                m_nCount = 0;
            }
        }
        return m_nCount;
    }

    std::string getNextToken(
        char p_cDelimiter)
    {
        return getNextToken(std::string(1, p_cDelimiter));
    }

    std::string getNextToken()
    {
        return getNextToken(m_strDelimiter);
    }

    std::string getNextToken(
        const std::string& p_strDelimiter)
    {
        if (std::string::npos==m_nTokenized)
        {
            throw std::runtime_error("No more tokens");
        }

        std::string::size_type nStart = m_nTokenized;
        m_nTokenized = m_strText.find_first_of(p_strDelimiter, m_nTokenized);

        if (m_nCount>0) --m_nCount;

        if (std::string::npos==m_nTokenized)
        {
            return m_strText.substr(nStart);
        }
        return m_strText.substr(nStart, m_nTokenized++ - nStart);
    }
};


int main()
{
    StringTokenizer tokenizer(getenv("PATH"), ':');

    while (tokenizer.hasMoreTokens())
    {
        std::cout<<tokenizer.getNextToken()<<" -  ";
        std::cout<<tokenizer.countTokens()<<" tokens left"<<std::endl;
    }
}



Das unangenehme an der Sache: Wenn die Zeile, die mit dem Kommentar BUG versehen ist, herausnehme, funktioniert die Methode countTokens nicht mehr (mit gcc 2.95.3, Linux)!
Wenn das Feld m_nCount nicht mehr mutable deklarariere (und natürlich die ganzen Methoden ent-conste), dann geht es auch ohne die Zeile.
Spinne ich oder der Compiler?
EDIT: Natürlich glaube ich, daß der Compiler spinnt, aber kann das jemand bestätigen?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 19.09.2003 um 11:17 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.09.2003, 11:23 Uhr
virtual
Sexiest Bit alive
(Operator)


Hat sich erledigt: wurde in gcc 3.0.4 gefixt, ist ein Compilerbug.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.09.2003, 23:25 Uhr
~wissender
Gast


Sieht fein aus, sag mal virtual steht du auf die STL?

Das Syntaxhighlighting scheint nicht so ganz zu funzen...
Die using-Klausel ist übrigen zum "benutzen" da .
Muss ja auch mal meckern, du läßt mit deinen Perfektheiten da sonst keinen Raum

Was

CU
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: