Problem prawdopodobnie z silną typizacją C++

0

Generalnie pisze program na laborki z programowania obiektowego i zaczynamy od struktur i funkcji globalnych, wydaje mi się dlatego żeby docenić obiektowość i klasy. Ale ok do rzeczy

Main:

int _tmain(int argc, _TCHAR* argv[])
{
	struct Personel * marcin;
	marcin=(struct Personel *)malloc(sizeof(struct Personel));
	struct Oddzial onkologia;
	onkologia.nazwa="Onkologia";

	Personel(marcin,"Marcin","Mierzejewski",&onkologia,"Mezczyzna","05.12.1991");
	
	return 0;
}

klasy..tfu struktury:

struct Oddzial{
	string nazwa;
	struct Personel * ordynator;
	};

struct Personel{
	string imie;
	string nazwisko;
	Oddzial * oddzial;
	string dataUrodzenia;//ddmmrrrr
	string plec;
	};

"Konstruktor":

	void Personel(Personel * nazwa,string im,string na,Oddzial * od,string pl,string du)
		{
		nazwa->imie=im;
		nazwa->nazwisko=na;
		nazwa->oddzial=od;
		nazwa->plec=pl;
		nazwa->dataUrodzenia=du;
		}

Ok to może powiem w czym problem.kod się bez problemu kompiluje natomiast przy wywołaniu konstruktora zaczynają sie dziwne rzeczy dziać, po prostu nie da rady przepisać stringa do pola. w "autos" cały czas pokazuje <badPtr> i teraz tak moje przypuszczenia które sprawdziłem przed wysłaniem postu tutaj.

-wywołałem funkcje z prawdziwymi obiektami typu string a nie jakimiś const [] charami castowanymi dopiero później na sting,niestety nic to nie zdziałało
-wywaliłem ciało funkcji- nic się nie popsuło a ja się upewniłem że błąd musi być własnie w tym ciele.
-zmieniłem nazwa->imie na *nazwa.imie ale to chyba na odwrót było bo coś się kompilator czepiał: D

Ok powiem tak nie oczekuje gotowego rozwiązania bo bardzo chce się tego nauczyć, fajnie by było usłyszeć co warto sprawdzić i co może byc ew. przyczyną nawet tak na szybko bez wklejania tego do swojego IDE.

w ten sposob mi działa:
struct Personel wojtek;
Personel(&wojtek,"Marcin","Mierzejewski",&onkologia,"Mezczyzna","05.12.1991");

jednak potrzebuje użyć malloca ponieważ tego wymaga prowadzący a i usuwanie ma korzystać z funkcji free która może być wywoływana chyba tylko na rzecz obiektów stworzonych mallociem

1

ookeej...

        string nazwa;

tu mamy string, co by sugerowało C++, ale

        struct Personel * marcin;
        marcin=(struct Personel *)malloc(sizeof(struct Personel));
        struct Oddzial onkologia;

tu mamy ścisłe C; i choć taki kod w C++ się również skompiluje, to zdecyduj się jednak, w czym piszesz: w C czy w C++.

void Personel(Personel * nazwa,string im,string na,Oddzial * od,string pl,string du)
{
nazwa->imie=im;
no nie, ten „konstruktor” w ogóle nie jest konstruktorem, chyba że bawimy się w udawaną obiektowość pod C. ponownie: zdecyduj się, w czym piszesz…

jednak potrzebuje użyć malloca

zakładając zachowanie tego twojego dziwnego „konstruktora”, to byłoby coś tego typu (nie sprawdzane):

struct Personel *wojtek = (Personel*)malloc(sizeof(Personel));
Personel(wojtek,"Marcin","Mierzejewski",&onkologia,"Mezczyzna","05.12.1991");
...
free(wojtek);

ale to jest nadal „nie wiadomo co”:

• w C++ raczej użyłoby się new i delete i prawdziwego konstruktora,
• w C mogłoby to wyglądać mniej-więcej tak jak jest, ale nie ma w nim stringa, więc zostają ci char[] albo char*

ponieważ tego wymaga prowadzący
jeśli prowadzący nie rozróżnia C od C++ i nie daje jasno do zrozumienia, co jest w jednym języku a co w drugim, i jak wygląda typowy kod w jednym i w drugim, to pozostaje mi współczuć.

3

Problem jest dość trywialny. Tak możesz alokować pamięć TYLKO jeśli elementami strktury są prymitywy -> inty, chary itd. NIE WOLNO tak robić jeśli elementem struktury jest jakiś bardziej skomplikowany obiekt. Bo malloc() tylko alokuje pamięć i NIE WYWOŁUJE kontruktorów klas. W efekcie interpretujesz pewne losowe bajty jako obiekt klasy (w tym przypadku klasy string) i stąd dzieją się cuda.

1
struct Personel {
        string imie;
        string nazwisko;
        Oddzial * oddzial;
        string dataUrodzenia;//ddmmrrrr
        string plec;
        Personel (string im,string na,Oddzial * od,string pl,string du)
        {
                imie=im;
                nazwisko=na;
                oddzial=od;
                plec=pl;
                nazwadataUrodzenia=du;
        }
};

// tworzenie obiektu:
        Personel *marcin = new Personel("Marcin","Mierzejewski",&onkologia,"Mezczyzna","05.12.1991");
// niszczenie obiektu:
        delete marcin;

1 użytkowników online, w tym zalogowanych: 0, gości: 1