Loading...
Sorry! Nu exista probleme...(inca)

Problema #37

1
#include <iostream>
2
using namespace std;
3
4
class A {
5
    static int x;
6
7
public:
8
    A (int i = 0) { x = i; }
9
    
10
    int getX() { return x; }
11
    int& setX(int i) { x = i; }
12
    
13
    A operator=(A other){
14
        setX(other.getX());
15
        return other;
16
    }
17
};
18
19
int main()
20
{
21
    A a(100), b;
22
    cout << (b = a).getX();
23
    return 0;
24
}
Programul functioneaza corect?
DA
NU
Programul nu functioneaza corect, avem eroare la compilare (mai exact linking error)
unresolved external symbol "private: static int A::x" (?x@A@@0HA)
Variabilele statice dintr-o clasa trebuie definite in afara ei. x este declarata in clasa dar nu este definita. De obicei cand declari ceva tot atunci si definesti in acelasi timp, dar variabilele statice intr-o clasa sunt o exceptie. Daca nu declari o variabila ai probleme la compilare, daca nu definesti o variabila ai probleme la linkare.
1
class A{
2
	int x;		   // declari si definesti x
3
	static int y;  // declari y
4
};
5
6
int A::y = 0;	   // definesti y
Ca sa fie corect, poti schimba linia 5:
static int x;
in
int x;
si acum x nu mai e
static
.
La
A a(100), b;
se apeleaza constructorul pentru a cu valorea
100
, si x ia valorea 100. Pentru b se apeleaza constructorul cu parametrul implicit si x ia valorea 0. La linia
cout << (b = a).getX();
se apeleaza mai intai operatorul
=
(b apeleaza si a este argumentul).
a se transmite prin valoare in functie (
A operator=(A other)
) deci other e o copie al lui a.
setX(other.getX());
seteaza x-ul din obiectul in care suntem (b din main) la valorea returnata de
other.getX()
(other este o copie a lui a din main deci se returneaza 100). Acum x-ul din b este 100. Functia
operator=
returneaza o copie (nu referinta la obiectul curent, cum se face de obicei) a lui other care e neschimbat (care e o copie al lui a din main). Revenind in main,
(b = a)
este un obiect temporar (adica ce returneaza
operator=
) cu x-ul egal cu 100. Deci
getX()
intoarce
100
si asta se afiseaza.
La linia 11:
int& setX(int i) { x = i; }
nu e tocmai gresit dar n-are sens sa ai o functie care intoarce ceva si sa nu intorci nimic (poate pe visual studio da eroare la linia asta)