#include "stdafx.h"

struct person { // 128 + 128 + 4 = 260
// member data
char *name;
int age;
char *address;

//////////////////////////////////////////////////////////////////////////
// методи

void inputdata(); // прототип
void testthis(); // прототип
void allocmem(); // прототип

// прототип на конструктор
person();

// прототип + реализация на конструктор
person(int in_age) {
std::cout << "constructor 2 called \n";
allocmem();
age = in_age;
}

// прототип + реализация на деструкторен метод
~person() {
std::cout << "destructor called !" << std::endl;
delete name;
delete address;
}
} ppl[10]; // тук създаваме 10 инстанции

// помощен метод заделяне на памет
void person::allocmem() {
name = new char[128];
address = new char[128];
// задаване на "съдържание по подразбиране"
strcpy(name, "<undef>");
strcpy(address, "<undef>");
age = 0;
}

// реализация на тялото на метод извън дефиницията на класа
person::person() {
std::cout << "constructor 1 called \n";
this->allocmem(); // явно извикване на член-фунцкяи
}

// реализация на функция за четене на данни
void person::inputdata() {
// name & age са член-данни
// и от тук изглеждат като локални данни
std::cout << "struct located at: " << (unsigned int) this << std::endl;
std::cout << "--name (" << (unsigned int) name << ") : ";
std::cin.getline(name, 128, '\n');

std::cout << "--age : (" << &age << ") : ";
std::cin >> age;
if (std::cin) // ако нещо е останало в буфера неизчетено
std::cin.get(); // например нов ред - да го прочетем
}

// много кратка функция, която създава нов обект и го връща
person* testme() {
person localvar;
person* t = new person; // create instance
return t; // ... and return to caller
} // localvar се унищожава и се вика деструкторът и

// реализация, която цели да покаже
// че можем да приложим метод в/у всеки вид указател
// стига да е от правилния тип
// но че NULL указател не би трябвало да попада в this
void person::testthis() {
if (this == NULL) {
std::cout << "something is wrong. calling method on NULL reference" << std::endl;
} else {
std::cout << (unsigned int) this;
}
}

int main() {
std::cout << "-- in main function -- \n";
person* pp;
pp=NULL;
pp->testthis();
// pp->inputdata(); // will produce error

pp = testme();
std::cout << "person size: " << sizeof(person) << std::endl;
std::cout << "pp size: " << sizeof(pp) << std::endl;
std::cout << "ppl size: " << sizeof(ppl) << std::endl;
std::cout << "please enter data for 3 ppl " << std::endl;

delete pp;

for (int n=0; n<3; n++) {
std::cout << std::hex ;
std::cout << n << "th struct at : " << &ppl[n] << std::endl;
ppl[n].inputdata();
}

std::cout << " create and delete some more... \n";
person *more = new person[5];
delete[] more; // извиква деструктора за всички обекти в масива

return 0;
}

Last modified: Friday, 1 March 2013, 1:22 PM