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 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 x3
static int y; // declari y4
};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)