• 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

0 głosów
859 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ź 531 wizyt
pytanie zadane 3 czerwca 2016 w C i C++ przez Ehlert Ekspert (215,230 p.)
0 głosów
1 odpowiedź 936 wizyt
0 głosów
1 odpowiedź 447 wizyt
pytanie zadane 9 listopada 2018 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

93,733 zapytań

142,669 odpowiedzi

323,287 komentarzy

63,295 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...