[ _SASA_ @ 29.11.2006. 10:56 ] @
Ovo mi je kod:
Code:

  //trace minLenghtValue_ is it is set
  stringstream sMinValue;
  if (isMinValueSet() == true)
  {
    int minValue = getMinLength();
    sMinValue << "minLengthValue_: " << minValue;
  }
  else
  {
    sMinValue << "minLengthValue_: " << "IS NOT SET!!!";
  }
  TRC_DEBUG_VAR( sMinValue.str() ));


TRC_DEBUG_VAR mi je macro.

i htio bih poslije "TRC_DEBUG_VAR( sMinValue.str() ));" nekako izbirati "stringstream sMinValue;" tako da ga poslje ne mogu vise koristiti...

HVALA
[ kiklop74 @ 29.11.2006. 11:46 ] @
Ovo zavisi od toga sta hoces jer nisi bio dovoljno precizan u pitanju.

Ako hoces da obrises sadrzaj sMinValue onda se to radi ovako:
Code:
sMinValue.str("");


Ako hoces da sMinValue postoji samo u datom delu koda i posle se automatski obrise onda ovako:
Code:
{ //obratiti paznju na pocetak bloka
  stringstream sMinValue;
  sMinValue << "minLengthValue_: ";
  if (isMinValueSet()) {
    sMinValue << getMinLength();
  }
  else{
    sMinValue << "IS NOT SET!!!";
  }
  TRC_DEBUG_VAR( sMinValue.str() ));
} //kraj bloka posle ovoga sMinValue vise ne postoji
[ _SASA_ @ 29.11.2006. 12:33 ] @
Ako hoces da sMinValue postoji samo u datom delu koda i posle se automatski obrise onda ovako:
Code:

{ //obratiti paznju na pocetak bloka
  stringstream sMinValue;
  sMinValue << "minLengthValue_: ";
  if (isMinValueSet()) {
    sMinValue << getMinLength();
  }
  else{
    sMinValue << "IS NOT SET!!!";
  }
  TRC_DEBUG_VAR( sMinValue.str() ));
} //kraj bloka posle ovoga sMinValue vise ne postoji


Ovo sto si mi napisao bi mi pomoglo, palo je i meni napamet to rijesenje, samo mi pari malo nezgrapno.

Mislio sam da li postoji nacin da pozovem destruktor od stringstream -a, ber bih morao staviti {} na jedno 10-tak mjesta u funkciji a to mi par malo ruzno za vidjeti...
[ X Files @ 29.11.2006. 13:24 ] @
Citat:

Mislio sam da li postoji nacin da pozovem destruktor od stringstream -a.

Upravo je to ono što ti je kiklop74 i savetovao.

Destruktor za stringstream, tj. za sMinValue se poziva automatski,
hteo ne hteo, odmah nakon završetka bloka:
Code:

{
  stringstream sMinValue;
  // ...
} <--- OVDE


Možda jeste neobično, ali je vrlo primenljivo i jasno.
[ _SASA_ @ 29.11.2006. 13:43 ] @
Dobro krivo sam rekao, kako pozvati destruktor od stringstream samostalno a ne automatski ?

jasan je meni bio njegov kod
to je ko da napisem
Code:

{
  int jozo = 4;
}
// sada jozo ovdje ne postoji


nego me znaima kako bi mogao unistiti jozu bez toga da ga stvaim unuta "{ }" ?
[ Goran Arandjelovic @ 29.11.2006. 15:30 ] @
Ako si ga već tako kreirao, moraćeš da čekaš da izađe iz bloka pa će se onda pozvati destruktor, kao što ti reče X Files.
Čini mi se da u stringstream-u postoji metod clear()... dakle mogao bi da uradiš sMinValue.clear()
ili da objekat sMinValue kreiraš na heapu i da ga obrišeš kada ti rešiš...
recimo...
stringstream *sMinValue = new stringstream;
// ovde nešto radiš...
delete sMinValue;

verovatno si na to mislio.
[ X Files @ 29.11.2006. 16:37 ] @
Da, ovde je zapravo nejasno šta se misli pod "izbrisati" ili "uništiti" stringstream objekat.

Za kompajler (i naknadno korišćenje), objekat će biti "uništen" i nevidljiv odmah nakon
izlaska iz bloka.

U svim ostalim slučajevima objekat može biti "napunjen" podacima ili "prazan" i uvek je
vidljiv i dostupan.

http://www.cplusplus.com/ref/iostream/stringstream/
Videti metodu clear()

Ukoliko je cilj sprečiti "spolja" pristup stringstream objektu onda OOP i "private" mehanizam
može takođe da posluži.
[ kiklop74 @ 30.11.2006. 13:03 ] @
Inace je besmisleno koristiti stringstream samo zarad jednog trace jer ta klasa se ne odlikuje nekom posebnom brzinom i relativno je teshka.

Ja bih, na primer uradio neshto drugo:
Code:
#include <vector>
#include <cstdlib>
#include <windows.h>

#ifndef TRACE
#define TRACE OutputDebugString
#endif

int getMinLength() {return 2;}

void traceTest(bool condition) {
  std::vector<char> sBuff(100,'\0');
  if (condition) {
    std::sprintf(&sBuff[0],"minLengthValue_: %d\n",getMinLength());
  } else {
    std::sprintf(&sBuff[0],"minLengthValue_: IS NOT SET\n");  
  }
  TRACE(&sBuff[0]);
}

int _tmain(int argc, _TCHAR* argv[])
{
  traceTest(true);
  traceTest(false);
  return EXIT_SUCCESS;
}
[ kiklop74 @ 01.12.2006. 13:35 ] @
Posle malo razmisljanja o problemu shvatio sam da je mnogo bolje imati implementaciju stream klase koja ce tekst da preusmerava na trace funkciju. Kao rezultat toga napisao sam tracestream klasu.

Zainteresovani mogu da je preuzmu odavde: http://cablemodem.fibertel.com.ar/mega/traceStream.zip

Upotreba je vrlo jdnostavna:

Code:

#include "debuglog_stream.h"

tracestream sout; //ovo je verzija sa obicnim stringovima char*
                         //postoji i unicode verzija wtracestream

void testfn () {
  sout << "probna poruka " << 222 << std::endl;
}
[ kiklop74 @ 20.10.2008. 19:26 ] @
Nova verzija traceStream implementacije se od juce moze preuzeti sa vec pomenute adrese.

Glavni novitet je dodatak singleton implementacije koja oslobadja programera obaveze da razmislja da li je i gde instancirao stream. Ovako je objekat inicijalizovan pri prvom pozivu i zivi dok se ne zatvori thread u kome je inicijalizovan.

Code:

/**
   singleton (dstream) je implementiran kao template klasa i ima 3 preddefinisane instance:
   
typedef dstream<char   > cdstream;
typedef dstream<wchar_t> wdstream;
typedef dstream<TCHAR  > tdstream;

*/

#include "debuglog_stream.h"

int main(void) {
    
  tdstream::dout() << TEXT("Test output ")
                   << 1 
                   << TEXT(" and now something different ")
                   << 1.2f
                   << std::endl;
  
  return 0;
}


Preuzeti odavde:
http://cablemodem.fibertel.com.ar/mega/traceStream.zip