Ez miért nem jó? C++
//main.cpp
# include <iostream>
# include <stdlib.h>
typedef unsigned short ushort;
typedef unsigned int uint;
using std::cout;
using std::cin;
using std::endl;
using std::string;
class PROBA
{
public:
PROBA();
PROBA(PROBA&);
~PROBA();
};
PROBA::PROBA()
{cout <<"Konstruktor \n";}
PROBA::PROBA(PROBA&)
{cout <<"Copy Konstruktor \n";}
PROBA::~PROBA()
{cout <<"Destruktor \n";}
PROBA FunctionOne(PROBA TheProba);
PROBA* FunctionTwo(PROBA *TheProba);
int main()
{
PROBA Proba1;
cout <<"Call FunctionOne \n";
FunctionOne(Proba1);
cout <<"Call FunctionTwo \n";
FunctionTwo(&Proba1);
return EXIT_SUCCESS;
}
PROBA FunctionOne(PROBA TheProba)
{cout <<"FunctionOne returning \n"; return TheProba;}
PROBA* FunctonTwo(PROBA *TheProba)
{cout <<"FunctionTwo returning \n"; return TheProba;}
.....................................
Hibaüzenet:Undefined reference to 'FunctionTwo(PROBA*)'
És így miért nem jó?
//main.cpp
# include <iostream>
# include <stdlib.h>
typedef unsigned short ushort;
typedef unsigned int uint;
using std::cout;
using std::cin;
using std::endl;
using std::string;
class PROBA
{
public:
PROBA();
PROBA(PROBA&);
~PROBA();
};
PROBA::PROBA()
{cout <<"Konstruktor. \n";}
PROBA::PROBA(PROBA&)
{cout <<"Copy Konstruktor. \n";}
PROBA::~PROBA()
{cout <<"Destruktor. \n";}
const PROBA FunctionOne(const PROBA TheProba);
PROBA* FunctionTwo(PROBA *TheProba);
int main()
{
PROBA Proba1;
cout <<"Call FunctionOne. \n";
FunctionOne(Proba1);
cout <<"\nCall FunctionTwo. \n";
FunctionTwo(&Proba1);
return EXIT_SUCCESS;
}
const PROBA FunctionOne(const PROBA TheProba)
{cout <<"FunctionOne returning. \n"; return TheProba;}
PROBA* FunctionTwo(PROBA *TheProba)
{cout <<"FunctionTwo returning. \n"; return TheProba;}
//const PROBA FunctionOne(const PROBA TheProba) E függvény miatt nem akar lefordulni mert const tettem a bemenő paraméter elé.Ezzel azt szerettem volna el érni,hogy ne tudjak a TheProba-t felül írni egy másik objektummal.





Gondolom prog.hu-ra is te raktad be ezt. Ott még elsakkozgattatok volna egy darabig, mire rájössz, hogy be kell másolni az összes releváns kódot, itt a másoló konstruktor a hibás. A másoló konstruktor deklarációja mindig így nézzen ki T típus esetén:
T(const T&);





"Szia.
Léci ki fejtenéd bővebben,hogy miért így nézzen ki mindig a másoló konstruktor.
Köszike :)"
Nos, ha eltekintünk a nyelvtani hibáktól, azért kell így kinéznie elsősorban, mert a const T& többmindenre bindol, mint a sima T&. Például konstans objektumokra, de ami fontosabb, temporálisokra.
Tehát ha ilyet írsz, hogy:
const MyClass o1;
MyClass o2(o1);
Itt a másoló konstruktornak egy konstanst akarsz átadni. Ha nem konstanst vár, akkor nem fog tudni lefordulni, konstansból nem konvertálódik nem-konstanssá.
Másik: ha pl a string másoló konstruktorát konst nélkül írták volna meg, akkor ez a kód nem fordulna le:
std::string s1, s2;
std::string s3 = s1 + s2;
Ugyanis az s1 + s2 egy temporális, nem lehet rá normális referenciát állítani, csak konstanst.
További kérdések:
Minden jog fenntartva © 2025, 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!