Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Wskaźnik na std::vector

Ostatnio zmodyfikowano 2015-08-24 10:02
Autor Wiadomość
Cansisti
Temat założony przez niniejszego użytkownika
[C++] Wskaźnik na std::vector
» 2015-08-22 21:23:30
Cześć, chciałbym przekazać w argumencie wskaźnik na kontener std::vector tak żeby mógł być zapamiętany w klasie i żeby później wywoływane metody mogły operować na orginalnym kontenerze. Niestety nie zachowuje się on jak normalna tablica a gdy przekazuję jako
std::vector < char > * vec
 dostaję błąd przy próbie przypisania wartości
classvec[ 0 ] = 'a'
. Błąd:
no match for 'operator=' in '*((KLASA*)this)->KLASA::classvec= 'a''|
 (gdzie wcześniej przypisuję vec do classvec)
P-136722
notabigthreat
» 2015-08-22 21:28:05
Cały kod proszę?
P-136723
Cansisti
Temat założony przez niniejszego użytkownika
» 2015-08-22 21:38:19
Nieważne, czytałem tutaj http://cpp0x.pl/kursy/Kurs-STL-C++/Kontener-tablicy-std-vector/119 o iteratorze ale niezbyt go rozumiałem. Pokombinowałem i wyszło :) Działający kod:
C/C++
class KLASA {
private:
    std::vector < char >::iterator cvec;
public:
    void setVector( std::vector < char >::iterator v ) {
        cvec = v;
        return;
    }
    void modVector() {
        cvec[ 3 ] = 'a';
        return;
    }
};

int main() {
    std::vector < char > vec;
    KLASA veccls;
    veccls.setVector( vec.begin() );
    veccls.modVector();
    return 0;
}
P-136726
notabigthreat
» 2015-08-22 21:41:28
BTW, CAPSEM oznaczane są makra, więc nie zdziw się, jak
KLASA
zostanie podmienione na coś innego.
P-136727
Cansisti
Temat założony przez niniejszego użytkownika
» 2015-08-22 21:43:35
Zawsze nazywałem swoje klasy z capsa i działało, ale dziękuję za uwagę :) Jaka jest w takim razie konwencja nazywania klas?
P-136729
pekfos
» 2015-08-22 22:18:21
Jaka jest w takim razie konwencja nazywania klas?
Nie capsem. Z częściej widywanych, to nazwa_klasy, lub NazwaKlasy.
P-136736
RazzorFlame
» 2015-08-22 22:19:16
cvec[ 3 ] = 'a';
Tak to nie działa. Iterator pokazuje na jeden element, więc prędzej (*cvec) = 'a';
Jak chcesz ustawic 3 element vectora to musisz miec ten vector. Przyklad:
C/C++
class Klasa
{
    std::vector < char > * VectorPointer;
public:
    Klasa( std::vector < char > * VectorPointerArg )
    {
        VectorPointer = VectorPointerArg;
    }
    void DoSomething()
    {
        if( VectorPointer ) // Czy VectorPointer jest poprawnym wskaznikiem (w tym przypadku != nullptr)
        {
            ( * VectorPointer )[ 3 ] = 'a';
        }
    }
};
int main()
{
    std::vector < char > MyVector( 999 );
    Klasa ObiektKlasy( & MyVector );
    ObiektKlasy.DoSomething();
    return 0;
}
P-136737
Cansisti
Temat założony przez niniejszego użytkownika
» 2015-08-22 22:40:25
Hmm mi zadziałało w taki sposób w jaki napisałem wyżej (z iteratorem), ale dzięki za sugestię, już wiem czemu nie działało na wskaźniku, nie używałem (*wskaźnik)='a' tylko wskaźnik='a'.
Myślę że iterator działa bo przekazuję adres na początek (jakby) tablicy (funckja vector::begin()) więc nie ma problemu żeby odwołać się do kolejnych elementów tak jak przy wskaźniku na zwykłą tablicę.
P-136743
« 1 » 2
  Strona 1 z 2 Następna strona