[ Pretender @ 18.04.2004. 01:24 ] @
| Code:
//: C05:Friend.cpp
// Friend allows special access
#include <iostream>
using namespace std;
// Declaration (incomplete type specification):
struct X;
struct Y {
void f(X*);
};
struct X { // Definition
private:
int i;
public:
void initialize();
friend void g(X*, int); // Global friend
friend void Y::f(X*); // Struct member friend
friend struct Z; // Entire struct is a friend
friend void h();
};
void X::initialize() {
i = 0;
}
void g(X* x, int i) {
x->i = i;
}
void Y::f(X* x) {
x->i = 47;
}
struct Z {
private:
int j;
public:
void initialize();
void g(X* x);
void q(X* x);
};
void Z::initialize() {
j = 99;
}
void Z::g(X* x) {
x->i += j;
}
void Z::q(X* x) {
cout << "Z::j == " << j << endl;
cout << "X::i == " << (x -> i) << endl;
}
void h() {
X x;
x.i = 100; // Direct data manipulation
}
int main() {
X x;
Z z;
z.g(&x);
z.q(&x);
getchar();
} ///:~
out:
Z::j == 4370432
X::i == 8740868
Dobiju se ove adrese (i to ne u hex), umesto integera 99 i 100, zasto?
TX |
[ NastyBoy @ 18.04.2004. 02:06 ] @
Konstruktori klasa kod tebe ne postoje, a nigde ni ne pozivash initialize(). Zato i dobijash nebulozne (random) vrednosti, member varijable nisu inicijalizovane.
[ darkosos @ 18.04.2004. 07:37 ] @
Nisam znao da u struct-u ima private i public?
A i nije mi do kraja jasna poenta - napisati malo koda sa puno konfuzije?
K'o što reče Nasty, ili pozivaj odgovarajuće Initialize funkcije direktno ili napiši konstruktore koji ih pozivaju, pa će se inicijalizovati indirektno.
[ Pretender @ 18.04.2004. 15:01 ] @
U pravu ste, ali ovo je primer iz 'Thinkin in C++', ja sam samo umetnuo f-ju Z::q.
Nemam bas iskustva sa strukturama (nisam ni znao da imaju konstruktore), ali sad vidim da nema poziva initialize().
Istina, u ovom delu knjige jos nisu obradjene klase i konstruktori, ali ne znam kako je autor mislio da ovo radi.
[ NastyBoy @ 18.04.2004. 15:08 ] @
Struktura ti je isto shto i klasa (male razlike u default pristupu : kod strukture se podrazumeva public, kod klase private, itd.), tako da sve shto radish sa klasom mozhesh i sa strukturom. Ukljuchujuci i konstruktor/destruktor koji bih ti preporuchio u tvom primeru. :)
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.