Kezdőoldal » Számítástechnika » Programozás » Egy osztály std::map adattagjá...

Egy osztály std::map adattagján nem lehet végigmenni const módban (C++)?

Figyelt kérdés

class VPG {

std::vector<std::map<int,std::pair<float,float> > > x;

public:

void akarmi();

};



void VPG::akarmi()

{

std::map<int,std::pair<float,float> >::iterator i;


for (i = x.begin(); i != x.end(); i++) {}



Ha az akarmi const, akkor nem fut le!



2012. aug. 14. 23:27
 1/8 anonim ***** válasza:

Így sem fut le.

A std::map<int,std::pair<float,float> >::iterator i; helyett std::vector<std::map<int,std::pair<float,float> > >::iterator i; típusú iterátor kell és jó lesz const-al is.

2012. aug. 15. 10:13
Hasznos számodra ez a válasz?
 2/8 A kérdező kommentje:

Bocs elírtam. Természetesen x helyett mondjuk x[0].

x[0]-al lefut, de csak akkor ha const nincs! Miért?

2012. aug. 15. 11:26
 3/8 anonim ***** válasza:

"Természetesen x helyett mondjuk x[0].

x[0]-al lefut, de csak akkor ha const nincs! Miért?"

Nem jól mondod, nem fordul le, nyilván ha nem fordul le akkor le sem fut, de ha nem fut le valami attól még lefordulhat, pl if (1==2) {std::cout << "Lefut" << endl;}

kódrész nem fut le, de lefordul.


Nem mindegy hogy x-et akarod bejárni vagy x[0]-t.

Ha x-et akkor amit írtam, ha x[0]-t akkor jó iterátor típust adtál meg, csak akkor így kellett volna:

std::map<int,std::pair<float,float> >::iterator i;

for (i = x[0].begin(); i != x[0].end(); i++) {}

Egyébként const-al is meg const nélkül is működik.

2012. aug. 15. 16:14
Hasznos számodra ez a válasz?
 4/8 A kérdező kommentje:

Ha a fene fenét eszik se fordul le! Itt a pontos kód:


#include <iostream>

#include <vector>

#include <map>


class myclass {

std::vector<std::map<int,std::pair<float,float> > > x;

public:

void myfunc() const;

};


void myclass::myfunc() const

{

std::map<int,std::pair<float,float> >::iterator i;

for (i = x[0].begin(); i != x[0].end(); i++) {}

}


int main()

{

std::cout << "Hello world!" << std::endl;

return 0;

}

2012. aug. 15. 16:36
 5/8 A kérdező kommentje:

Ha kiszedem a const-ot (mindkét helyről), akkor lefordul és le is fut! De egyébként ezt adj a g++ fordító:


C:\Users\mgaspar\Desktop\VPG>g++ p.cpp -o p.exe

p.cpp: In member function 'void myclass::myfunc() const':

p.cpp:14: error: no match for 'operator=' in 'i = ((const std::map<int, std::pai

r<float, float>, std::less<int>, std::allocator<std::pair<const int, std::pair<f

loat, float> > > >*)((const myclass*)this)->myclass::x.std::vector<_Tp, _Alloc>:

:operator[] [with _Tp = std::map<int, std::pair<float, float>, std::less<int>, s

td::allocator<std::pair<const int, std::pair<float, float> > > >, _Alloc = std::

allocator<std::map<int, std::pair<float, float>, std::less<int>, std::allocator<

std::pair<const int, std::pair<float, float> > > > >](0u))->std::map<_Key, _Tp,

_Compare, _Alloc>::begin [with _Key = int, _Tp = std::pair<float, float>, _Compa

re = std::less<int>, _Alloc = std::allocator<std::pair<const int, std::pair<floa

t, float> > >]()'

c:\programs\strawberryperl\c\bin\../lib/gcc/i686-w64-mingw32/4.4.3/../../../../i

nclude/c++/4.4.3/bits/stl_tree.h:154: note: candidates are: std::_Rb_tree_iterat

or<std::pair<const int, std::pair<float, float> > >& std::_Rb_tree_iterator<std:

:pair<const int, std::pair<float, float> > >::operator=(const std::_Rb_tree_iter

ator<std::pair<const int, std::pair<float, float> > >&)

2012. aug. 15. 16:37
 6/8 anonim ***** válasza:

Ja bocsi figyelmetlen voltam, én valami miatt erre gondoltam : const void akarmi();

Így tényleg nem lehet, értékadó operátor-t nem lehet használni az adattagokra, "&" operátort sem stb.

Márpedig ez történik i = x.begin() hatására, de van kiskapu a megkerülésére mégha nem is elegáns.

2012. aug. 15. 22:45
Hasznos számodra ez a válasz?
 7/8 A kérdező kommentje:
Közben megoldódott: const iteratort-kell használni!
2012. aug. 15. 23:24
 8/8 anonim ***** válasza:

Akkor a tied az elegáns megoldás, nem szoktam const metódusokat használni pedig hasznos lehet.

Én megoldásom tiszta gányolás még a fordítót is szabályozni kell hogy megengedő legyen.

Akkor a megoldásod hogy is néz ki?

2012. aug. 16. 10:21
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!