Egy osztály std::map adattagján nem lehet végigmenni const módban (C++)?
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!
Í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.
Bocs elírtam. Természetesen x helyett mondjuk x[0].
x[0]-al lefut, de csak akkor ha const nincs! Miért?
"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.
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;
}
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> > >&)
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.
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?
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!