fout: doorgeven van ‘const A’ als ‘dit’ argument van ‘void A::hi()’ wordt weggegooid
kwalificaties [-fpermissive]
Ik begrijp niet waarom ik deze foutmelding krijg, ik geef niets terug, ik geef alleen de referentie van het object door en dat is het dan.
#include <iostream>
class A
{
public:
void hi()
{
std::cout << "hi." << std::endl;
}
};
class B
{
public:
void receive(const A& a) {
a.hi();
}
};
class C
{
public:
void receive(const A& a) {
B b;
b.receive(a);
}
};
int main(int argc, char ** argv)
{
A a;
C c;
c.receive(a);
return 0;
}
@edit
Ik heb het opgelost met behulp van const correctheid, maar nu probeer ik methoden binnen dezelfde methode aan te roepen en ik krijg dezelfde fout, maar het rare is dat ik de verwijzing naar deze methode niet doorgeef.
#include <iostream>
class A
{
public:
void sayhi() const
{
hello();
world();
}
void hello()
{
std::cout << "world" << std::endl;
}
void world()
{
std::cout << "world" << std::endl;
}
};
class B
{
public:
void receive(const A& a) {
a.sayhi();
}
};
class C
{
public:
void receive(const A& a) {
B b;
b.receive(a);
}
};
int main(int argc, char ** argv)
{
A a;
C c;
c.receive(a);
return 0;
}
fout: ‘const A’ doorgeven als ‘this’ argument van ‘void A::hello()’
verwijdert kwalificaties [-fpermissive]fout: ‘const A’ doorgeven als ‘this’ argument van ‘void A::world()’
verwijdert kwalificaties [-fpermissive]
Antwoord 1, autoriteit 100%
Uw methode hi
is niet gedeclareerd als const
in uw A-klasse. Daarom kan de compiler niet garanderen dat het aanroepen van a.hi()
je constante verwijzing naar a
niet zal veranderen, dus het geeft een foutmelding.
U kunt hiermeer lezen over functies van constante leden en het juiste gebruik van het const
zoekwoord hier.
Antwoord 2
-
Zoals reeds vermeld, is een optie om de methode
hi
const-gekwalificeerd te maken. -
Een andere optie is om const_cast te gebruiken op het moment dat de methode
hi
wordt aangeroepen, zoals zo
A& ref = const_cast <A&>(a); ref.hi();