• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Problem z typem char, szablon klasy

42 Warsaw Coding Academy
0 głosów
791 wizyt
pytanie zadane 15 listopada 2015 w C i C++ przez Baakoma Użytkownik (780 p.)
zamknięte 15 listopada 2015 przez Baakoma

Witam, problem polega na tym, że, gdy wykorzystuje szablon klasy wektor jako typ char, program...nie działa jak należy, adresy zmiennych nie wyświetlają się i tego typu problemy. W sytuacji, gdy typem będzie int, float, double, bool, long, cokolwiek, program działa normalnie i adresy też się wyświetlają. Przy wykorzystaniu string program skacze o 4, myślę, że tutaj też coś jest nie tak. Tutaj kod:

#ifndef wektor_hpp
#define wektor_hpp

#include <iostream>

namespace amadi
{

template <class T>
class wektor
{
    T * tab;
    T * tabIterator;
    T * tabEnd;
    int tabSize;
public:
    wektor()
    {
        tabSize = 5;
        tab = new T [tabSize];
        std::cout << tab << std::endl;
        tabIterator = tab;
        tabEnd = tab+tabSize-1;
    }
    ~wektor()
    {
        delete [] tab;
        tab = NULL;
    }
    void wypisz()
    {
        for (int i = 0; i < tabSize; i++)
        {
            std::cin >> tab[i];
            std::cout << tab[i] << std::endl;
            std::cout << tab+i << std::endl;
        }
        std::cout << "tab: " << tab << std::endl;
        std::cout << "tabiterator: " << tabIterator << std::endl;
        std::cout << "tabEnd: " << tabEnd << std::endl;
        std::cout << "tabSize: " << tabSize << std::endl;
    }
};
}
#endif // wektor

A tutaj kod klasy main:

#include <iostream>
#include "wektor.hpp"

using namespace std;
using amadi::wektor;
int main()
{
    wektor <char> ziemniak;
    ziemniak.wypisz();
    return 0;
}

 

komentarz zamknięcia: Rozwiązane :)

1 odpowiedź

+1 głos
odpowiedź 15 listopada 2015 przez Radfler VIP (101,030 p.)
edycja 16 maja 2016 przez Radfler
 
Najlepsza

Char jest typem znakowym. Z tego powodu adres zmiennej typu char wypisywany z użyciem std::cout pojawi się jako seria ciąg znaków. Wywołując operator<< dla zmiennej typu char* strumień wypisuje string zakończony znakiem null. Tu jednak jest to adres do pojedynczego znaku, który nie jest stringiem, więc mamy zwyczajne UB.

#include <iostream>

int main() {
  char dummy;
  std::cout << &dummy << '\n'; // undefined behaviour
}

Jeżeli chcesz zobaczyć adres zmiennej, to użyj rzutowania na typ void*:

#include <iostream>

int main() {
  char dummy;
  std::cout << static_cast<void*>(&dummy) << '\n';
}

Podobne pytania

0 głosów
1 odpowiedź 477 wizyt
pytanie zadane 3 czerwca 2016 w C i C++ przez Ehlert Ekspert (215,010 p.)
0 głosów
1 odpowiedź 684 wizyt
0 głosów
1 odpowiedź 366 wizyt
pytanie zadane 9 listopada 2018 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

93,379 zapytań

142,380 odpowiedzi

322,533 komentarzy

62,734 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...