Forumi
Home Pravila i pomoć Članovi Kalendar Današnji postovi


Povratak   PC Ekspert Forum > Računala > Software > Web dizajn, programiranje i ostalo
Ime
Lozinka

Odgovori
 
Uređivanje
Staro 06.08.2009., 22:40   #1
D_A_R_K_O
Registered User
 
Datum registracije: Jul 2009
Lokacija: Srbija
Postovi: 8
Nasledjivanje i konstruktori u C++

Zasto ovaj programcic nece da se iskompajlira? Prijavljuje da je problem u konstruktoru Casopis, ali zbog cega? I kako prepraviti program da ovo radi?

Znaci, hocu da klasa Casopis nasledi klasu Publikacija, redefinise metodu ispis() klase Publikacija, zatim da u toku izvrsavanja (dakle, dinamicki), na osnovu korisnickog zahtjeva se pozove metoda ispis() ili iz Publikacije ili iz klase Casopis.
Naizgled, prosta stvar, nasledjivanje, konstruktori, inicijalizacije, ali....
Kada postojece konstruktore zamjenim default konstruktorima (tj. onim bez parametara), to ce sve da radi, incijalizacija ce se obaviti. Medjutim, sta ako hocu da napravim 15 objekata neke klase, pa nece svi imati default vrijednosti...treba nekad da se inicijalizuju i drugacijim vrijednostima od default-nih.

Dakle, evo koda:
=========================================================

#include<iostream>
using namespace std;

class Publikacija{

private:
int a1;

public:
Publikacija(int a){
a1 = a;
}

void ispis(){
cout <<"\n\ta1: "<<a1
<<endl;
}
};

class Casopis: public Publikacija{

private:
int a1;

public:
Casopis(int a){
a1 = a;
}

void ispis(){
cout <<"\na1: "<<a1
<<endl;
}
};

void ispisi_sve(Publikacija *p){
p->ispis();
cout<<endl;
}

main(){

Publikacija *p;
string izbor;

Publikacija objekat1(438);
Casopis objekat2(212);

cout <<"\nIz koje klase da pozovem metod ispis()? ";
cin >> izbor;
if(izbor == "publikacija") {p = &objekat1; ispisi_sve(p); }
else {p = &objekat2;
ispisi_sve(p);}
}
=========================================================

Hvala.
D_A_R_K_O je offline   Reply With Quote
Staro 08.08.2009., 12:12   #2
Dancho
Registered User
 
Datum registracije: Jun 2007
Lokacija: cro
Postovi: 42
evo probaj ovo,trebalo bi raditi bez problema...

Code:
#include <iostream>
#include <string>
using namespace std;

class Publikacija
{
	int a1;
public:
	Publikacija() {}
	Publikacija(int a){a1 = a;}

void ispis(){cout <<"\n\ta1: "<<a1<<endl;}
};

class Casopis: public Publikacija
{
	int a1;
public:
	Casopis(int a){a1 = a;}

void ispis(){cout <<"\na1: "<<a1<<endl;}
};

void ispisi_sve(Publikacija *p)
{
	p->ispis();
	cout<<endl;
}

int main(){
	Publikacija *p;
	string izbor;

	Publikacija objekat1(438);
	Casopis objekat2(212);

	cout <<"\nIz koje klase da pozovem metod ispis()? ";
	cin >> izbor;
	if(izbor == "publikacija") 
	{
		p = &objekat1; ispisi_sve(p); 
	}
	else 
	{
		p = &objekat2;
		ispisi_sve(p);
	}

	return 0;
}
Dancho je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Staro 10.08.2009., 15:06   #3
D_A_R_K_O
Registered User
 
Datum registracije: Jul 2009
Lokacija: Srbija
Postovi: 8
Kod se iskompajlira fino, bez greske. Medjutim, ovo ne radi dobro kad se pokrene. Izgleda da uvijek kad se pravi objekat u C++-u mora ovako da se radi:

Publikacija p = new Publikacija();

Tako nesto, uglavnom treba dinamicki dodjeliti memoriju za objekat, a zatim adresu tog mem. prostora smjestiti u pokazivac p.
I jos nesto...ispred prve funkcije ispis() treba staviti "virtual"....
D_A_R_K_O je offline   Reply With Quote
Staro 10.08.2009., 16:25   #4
Dancho
Registered User
 
Datum registracije: Jun 2007
Lokacija: cro
Postovi: 42
eh da,
posto radimo redefiniciju clana base klase ta se funkcija stoga mora deklarirati kao virtualna,treba samo dodati virtual ispred funkcije ispis()...
pocetnicka greska ,
ali nisam za svojim kompom i bez VSC++
Dancho je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Odgovori



Pravila postanja
Vi ne možete otvarati nove teme
Vi ne možete pisati odgovore
Vi ne možete uploadati priloge
Vi ne možete uređivati svoje poruke

BB code je Uključeno
Smajlići su Uključeno
[IMG] kod je Uključeno
HTML je Isključeno

Idi na