Symulator EU07 (i nie tylko) > Na warsztacie

 Exe - konwersja na C++

<< < (3/637) > >>

janek32:
Generalnie struktura powstała już w C i może zawierać dane i wskaźniki na dane/wskaźniki na funkcję, i tak jak napisał @Benek, cała jej zawartość jest publiczna. Klasa została wprowadzona w C++ i może zawierać funkcje (metody), posiada konstruktory i destruktor, domyślnie (bez użycia słów kluczowych public: albo protected:) jej zawartość jest prywatna.
Nie jestem pewny, jak struktura zachowuje się w C++ (nigdy np. funkcji w strukturze pisać nie próbowałem), ale raczej dobrze jest trzymać w kodzie takie rozróżnienie i struktur używać do tego, do czego historycznie służyły.

Klasa w C++ nie musi mieć zdefiniowanych konstruktorów, jeżeli nie ma, używane są domyślne. ZTCW zwykły konstruktor wtedy nic nie robi, kopiujący po kolei przepisuje zawartość wszystkich zmiennych. Własne konstruktory i destruktor przede wszystkim trzeba zdefiniować, jeżeli w klasie wykorzystuje się dynamicznie przydzielaną pamięć - ale czasami to może być też wygodne w innych sytuacjach, po prostu jak przy inicjalizacji obiektu trzeba coś zrobić.

Co do ostrzeżenia linkera - próbowałeś użyć dyrektyw IFNDEF?

--- Kod: ---#ifndef _NazwaPliku_H_
#define _NazwaPliku_H_

(kod)

#endif _NazwaPliku_H_
--- Koniec kodu ---
Wtedy jeżeli oznaczony w ten sposób plik jest przy linkowaniu dołączany kilka razy, kod z niego trafia do głównego tylko raz.

firleju:
#ifndef jest od samego początku. To była zmienna poza jakąkolwiek klasą i w związku z tym, że była w pliku nagłówkowym tylko to każdy cpp ją sobie domyślnie inicjował sam. Rozwiązaniem była deklaracja w nagłówku (extern) oraz definicja w jednym cpp. Teraz już działa.
W tej chwili walczę z funkcją konwersji int na string. W c++11 jest to_string(), ale wcześniej nie było i musiałem sobie zdefiniować taką globalną. Ale żeby była globalna zwraca static std::string to i nie chce mi jej dodawać do innego stringa za pomocą operator+. Chyba będę musiał użyć append.

queuedEU:
zrob sobie oddzielny modul z fukcjami, zobacz jak ja mam w qutils.h/cpp, laczenie jest bezproblemowe

atos atoi atof

lub


--- Kod: ---std::string itoss( int x ) {
  int length = snprintf( NULL, 0, "%d", x );
  assert( length >= 0 );
  char* buf = new char[length + 1];
  snprintf( buf, length + 1, "%d", x );
  std::string str( buf );
  delete[] buf;
  return str;
}
--- Koniec kodu ---

lub


--- Kod: ---std::string itoss(int val)
{
  std::stringstream ss;
  ss << val;

 return ss.str()
}

std::string itoss(int val)
{
 string tmp; // brzydkie rozwiązanie
 itoa(val, (char*)tmp.c_str(), 10);
 string str = tmp.c_str();
 return str;
}

char* itochp(int n)
{
     int i = 0;
     char tmp[12];
     static char ret[12];
     if(n < 0) {
      *ret = '-';
      i++;
      n = -n;
     }
     do {
      *tmp = n % 10 + 48;
      n -= n % 10;
      if(n > 9) *tmp++;
     }
     while(n /= 10);
     while(ret[i++] = *tmp--);
     return ret;
}
--- Koniec kodu ---

firleju:
Robię sprintf() ale coś nie bangla. Sprawdzę jak działa z twoją wersją.

queuedEU:
Jeszcze przyklad konwersji z float/double z obsluga wyjatku


--- Kod: ---inline std::string dtoss(double val)
{
  std::ostringstream o;
  if (!(o << val))
    throw BadConversion("stringify(double)");
  return o.str();
}
--- Koniec kodu ---

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

[*] Poprzednia strona

Idź do wersji pełnej
Powered by Advanced Topic Prefix Pro
Powered by SMFPacks Likes Pro Mod