class Person
{
private:
int _id;
string _name;
int _age;
public:
Person(int i, string n, int a)
:_id(i), _name(n), _age(a)
{
}
};
Programiranje u C++-u - pitanja i odgovori
- poruka: 7.285
- |
- čitano: 1.712.790
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
class Person
{
private:
int _id;
string _name;
int _age;
public:
Person(int i, string n, int a)
:_id(i), _name(n), _age(a)
{
}
};
Moze i tako, pomocu inicijalizacijskih lista. Ovo je zapravo bolji nacin, jer su inicijalizacijske liste potrebne kod kompozicije i nasljedivanja. Takoder, ako su varijable const, opet je potrebna inicijalizacijska lista, jer ako se varijabla prvo deklarira, a onda joj se tek u konstruktoru dodjeljuje vrijednost, to ce biti ekvivalentno ovom kodu:
const int varijabla;
varijabla = 1; //error jer se const varijablama vrijednost mora odmah dodijeliti
Postovanje ako mi mozete pomoci kod ovoga. Trebam da ispisem romb samo sa crtama koje ga obiljezavaju i radi mi za brojeve do 8 a trebalo bi mi raditi za sve brojeve koje unes. molivas ako imate kakav savjet:
Evo ovako, program radi na principu dviju vanjskih petlji, prva vanjska petlja crta "gornji trokut", a druga vanjska petlja crta "donji trokut" romba.
U obje vanjske petlje izračun ide redosljedom: razmak - znak - razmak - znak.
Program radi sve dok ima dovoljno prostora na konzolnom ekranu.
#include<iostream>
using namespace std;
int main()
{
int n;
cin>> n;
for (int i = 0; i < n ; i++)
{
for (int j = 0; j < n-i-1; j++)
{
cout<< " ";
}
cout<< "/";
for (int k = 0; k < i*2; k++)
{
cout<< " ";
}
cout<< "\\";
cout<< endl;
}
for (int i = n-1; i >= 0; i--)
{
for (int j = 0; j < n-i-1; j++)
{
cout<< " ";
}
cout<< "\\";
for (int k = 0; k < i*2; k++)
{
cout<< " ";
}
cout<< "/";
cout<< endl;
}
return 0;
}
Moze i tako, pomocu inicijalizacijskih lista. Ovo je zapravo bolji nacin, jer su inicijalizacijske liste potrebne kod kompozicije i nasljedivanja. ...
I ne samo zato...
Kad koristis inicijalizacijsku listu, prilikom konstrukcije sa standardnim 'new', tvoje vrijednosti inicijaliziraju tocno mjesto u memoriji _prije_ nego udjes u konstruktor. Sto (teoretski) znaci da su inicijalizacijske liste brze jer ako dodijeljujes vrijednosti unutar konstruktora, dodijeljujes vrijednosti dvaput - opet, teoretski, compiler je opcenito dovoljno pametan da sam napravi izmjene, i vecina compilera nece automatski inicijalizirati alociranu memoriju.
Apropos 'inline' - ista stvar. To je hint, a ne instrukcija (bas kao i 'register' npr.) Inline ne garantira da ce inlineirati, dovoljno je compilirati sa -O3 ili -Os i vidjeti da GCC i MSVC ne sljive inline hint ni pet posto.
U praksi - one-lineri su odlicni kandidati za inline, i opcenito ih compiler sam inlineira iovako ionako.
@TracerCPP
Btw - nisam imao pojma da implementacija u headeru automatski znaci i inline??? Jel to po standardu, ili samo ponasanje specificnog compilera sa specificnim opcijama???
@TracerCPP
Btw - nisam imao pojma da implementacija u headeru automatski znaci i inline??? Jel to po standardu, ili samo ponasanje specificnog compilera sa specificnim opcijama???
C++ ISO standard kaze:
"A function defined within a class definition is an inline function." - izvor
Ista stvar pise i u Demistificiranom, stoga bih rekao da je, po standardu je.
EDIT: Evo iz drafta, strana 144 (158).
"A function defined within a class definition is an inline function. The inline specifier shall not appear on a block scope function declaration.91 If the inline specifier is used in a friend declaration, that declaration shall be a definition or the function shall have previously been declared inline."
EDIT2: (boldano) Mislis tijelo f-je u klasi, a ne u headeru? :D
EDIT2: (boldano) Mislis tijelo f-je u klasi, a ne u headeru? :D
Cjepidlaka :-P
Ali hvala, nisam imao pojma :-) Ja uredno sve te metode oznacim sa inline...
Imam par nejasnoća oko naziva klasa, metoda i varijablu u c++'u.
Koliko znam u javi klase idu veliki početnim slovom, metode malim, a ako naziv ima više riječi, početna slova riječi su velika. U STL-u su svi nazivi malim slovima, a riječi u nazivu se odvajaju donjom crtom(_). Sada pomoću googlea tražim o konvencijama u c++ i nalazim na različita objašnjenja. Negdje piše da se nazivi klasa pišu u camel caseu, a funkcije malim slovima i riječi se odvajaju donjom crtom. Negdje drugdje da sve ide u camel caseu, na nakon trećem mjestu nešto treće. Što da od toga primjenjujem?
I ima li još ikakvih stvari na koje bi trebao paziti pri imenovanju?
Inace koliko ja znam za imena smijes koristiti i velika i mala sove i _(crtica) i to u svim mogucim kombinacijama. Npr za varijablu auto1 mozes napraviti
Auto1
aUto_1
A_Uto1
i tako sve kako zelis. U praksi se najcesce deklarira ovako:
imevarijable
ime_varijable
ImeVarijable
Nadam se da sam pomogao. Ja inace ovako deklariram i nikada nemam problema s tim.
klase, metode, svojstva - pascal case
podatkovni članovi, argumenti metoda - camel case
underscore izbaci
možda to jest po diktatu c sharpa, ali prevladava ovaj stil, sve više je u upotrebi.
ne sjećam se više kad sam za podatkovni član klase stavio _ime, mnogi to više ne koriste.
ostalo :
akronimi ako su dva slova ovako osobaIQ za podatkvni član , a za klasu ovako OsobaIQ
ako je više od dva slova onda ovako za klasu DrzavaUsa, a za podatkovni član drzavaUsa
Imam par nejasnoća oko naziva klasa, metoda i varijablu u c++'u.
Koliko znam u javi klase idu veliki početnim slovom, metode malim, a ako naziv ima više riječi, početna slova riječi su velika. U STL-u su svi nazivi malim slovima, a riječi u nazivu se odvajaju donjom crtom(_). Sada pomoću googlea tražim o konvencijama u c++ i nalazim na različita objašnjenja. Negdje piše da se nazivi klasa pišu u camel caseu, a funkcije malim slovima i riječi se odvajaju donjom crtom. Negdje drugdje da sve ide u camel caseu, na nakon trećem mjestu nešto treće. Što da od toga primjenjujem?
I ima li još ikakvih stvari na koje bi trebao paziti pri imenovanju?
Kako god zelis, pogledaj koji je najpopularniji stil, ja osobno se najvise drzim konvencija oko Jave, jer mi je Java najvise prirasla srcu kao jezik, opcenito zbog sintakse i "ljepote" jezika (no ne znaci da samo u Javi radim, trenutno samo u C++-u). Ali kad jedan stil odaberes, toga se onda dosljedno i drzi i to nek ti bude za stalno.
Druga je stvar pak, kad dodes raditi na neki projekt, vise-manje svaki projekt ima svoj stil pisanja koda (sto bi trebalo biti opisano u dokumentaciji) pa se onda toga drzis.
Jedino drugo sto trebas paziti kod imenovanja je da postujes pravila koja jezik namece (tipa, varijable ne mogu poceti brojkom i sl.).
Po meni ta logika
klasa - pascal
podatkovni član - camel
izgleda nekako najlogičnije
k tomu čemu underscored kad je razliku između pod. članova i varijabli u klasi i kad su istog imena lako pokazati this->a = a
Treba da izračunam ovakvu sumu
S = 1 /x+1 - 2! /(x+1)2 + 3!/(x+1)3 + ...+(.1)n-1 n!/(x+1)n
Eh sad, šta vi mislite kako mi je najlakše riješit?
Ne treba mi nikakav kod samo malo da mi pojasnite, ja više volim tako nego kod na gotovo, jer tako ništa ne mogu naučit :)
Pokušao sam ovako al' ne radi kako treba :S
int main(){
float suma,x,clan;
int i,j,n,f=1;
cout <<"unesi x:\n";
cin >> x;
cout <<"unesi n:\n";
cin>>n;
suma=0;
for(i=1;i<=n;i++){
for(int k=1; k<i;k++)
f*=k;
clan = f/pow((x+1),i);
suma=clan+pow(-n,n-1)*clan;
}
Pozdrav !
Dakle, imam problem,trebam selektirat i izbacit neke članove sa stoga, ugl dolazim do problema da bi ja htio koristiti trenutni datum što radim pomoću funkcija :
int time_god(){
time_t t = time(0); // get time now
struct tm * now = localtime( & t );
cout << (now->tm_year +1900) << '-'
<< (now->tm_mon + 1) << '-'
<< now->tm_mday
<< endl;
return (now->tm_year +1900);
}//godina
int time_mje(){ time_t t = time(0); // get time now
struct tm * now = localtime( & t );
return (now->tm_mon + 1);
}//mje
int time_dan(){
time_t t = time(0); // get time now
struct tm * now = localtime( & t );
return now->tm_mday;
}//dan
i onda dolje u mainu uspoređujem...ALI problem su ove linije...
if(time_god()-(pomocni_putnik.godina)<18 || time_god()-pomocni_putnik.godina>25) PopS(pomocni_stog);
if(time_god()-(pomocni_putnik.godina)==18 || time_mje() < pomocni_putnik.mjesec) PopS(pomocni_stog);//samo kad ima 18
if(time_god()-(pomocni_putnik.godina)==25 || time_mje() > pomocni_putnik.mjesec) PopS(pomocni_stog);//samo kad ima 25
if(time_god()-(pomocni_putnik.godina)==18 || time_mje()!=(pomocni_putnik.mjesec) || time_dan < pomocni_putnik.dan) PopS(pomocni_stog); <----Javlja gresku
if(time_god()-(pomocni_putnik.godina)==25 || time_mje()!=(pomocni_putnik.mjesec) || time_dan > pomocni_putnik.dan) PopS(pomocni_stog);<----Javlja gresku
Greska:
error: ISO C++ forbids comparison between pointer and integer
Nemam pojma zasto mi tek na 3. liniji izbaci gresku i nemam pojma kako ovo rijesti pa ako netko ima ideju bio bih zahvalan :)
[error - mod briši]
if(time_god()-(pomocni_putnik.godina)==18 || time_mje()!=(pomocni_putnik.mjesec) || time_dan < pomocni_putnik.dan) PopS(pomocni_stog); <----Javlja gresku
if(time_god()-(pomocni_putnik.godina)==25 || time_mje()!=(pomocni_putnik.mjesec) || time_dan > pomocni_putnik.dan) PopS(pomocni_stog);<----Javlja gresku
Problem je u ovome zutome, tj. u pozivu funkcije time_dan. Poslije naziva funkcije zaboravio si staviti zagradu (), pa to compiler tretira kao pokazivac na funkciju. Dakle umjesto time_dan pisi time_dan().
Treba da izračunam ovakvu sumu
S = 1 /x+1 - 2! /(x+1)2 + 3!/(x+1)3 + ...+(.1)n-1 n!/(x+1)n
Eh sad, šta vi mislite kako mi je najlakše riješit?
Ja bi to napravio jednom petljom, i to bez korištenja funkcije pow, jer bi tako dobio linearnu složenost izvođenja tj. O(n), u svakoj iteraciji petlje koja ide [1, n] podjelio bi iznos (faktorjel *= i) sa iznosom (potencija *= (x+1)), a taj rezultat strpao u varijablu suma, da bi to napravio moraš dobro znati redosljed izvođenja operatora, najprije se izvode operacije u zagradama u kojima se u svakoj iteraciji dobiju varijable faktorjel i potencija, zatim se one podijele, jedna od njih se casta u double i ta vrijednost se pridoda varijabli suma operatorom += .
Evo koda, pogledaj ako ti zapne sa savjetom iz prve rečenice.
#include<iostream>
using namespace std;
int main()
{
int faktorjel = 1, potencija = 1, n, x;
double suma = 0;
cin>> x;
cin>> n;
for (int i = 1; i <= n; i++)
{
suma += (faktorjel *= i) / (double) (potencija *= (x + 1));
}
cout<< suma << endl;
}
vrtim beskonačnu petlju u programu i hoću da kada korisnik pritisne X (za gašenje programa) da se izvrši određeni dio koda te nakon toga ugasi program. znači kad da spremi neke stvari prije nego se ugasi. kako?
Pseudokod:
do...
neki kod
if (user stisnuo X)
postavi uvjet koji breaka do petlju
else
nastavi za izvršavanjem programa
while (uvjet za break)
Pseudokod:
do...
neki kod
if (user stisnuo X)
postavi uvjet koji breaka do petlju
else
nastavi za izvršavanjem programa
while (uvjet za break)
Tako sam nekako i ja pomislio, a onda mi je sinulo da mozda cilja na X u kutu cmd prozora. U tom slucaju treba zasukati ruke u winAPI vjerojatno, nes kao ovo http://msdn.microsoft.com/en-us/library/windows/desktop/ms686016%28v=vs.85%29.aspx
Yep, to je vjerojatno to. A da bi mogao to iskoristiti, trebat će mu kod na foru ovog gore. Jedina je razlika što ne hvata neki keyPressEvent nego WinAPI funkciju.
Imam jedan string, u kojem se nalaze brojevi, recimo "0012345", dakle niz moze poceti s nulom. Ti brojevi meni trebaju kao integeri, svaki posebno, da mogu sa svakim pojedinacno manipulirati, znaci trebam ih potrpati u vektor integera -> (0, 0, 1, 2, 3, 4, 5).
E sad, koji je od ova dva pristupa bolji i zasto?
//temp variables used for conversion: string > int
std::string strTemp;
int intTemp;
for (std::string::const_iterator iter = strNumbers.begin(); iter != strNumbers.end(); ++iter)
{
strTemp = *iter;
std::istringstream istr(strTemp);
istr >> intTemp;
individualDigits.push_back(intTemp);
}
ili
for (std::string::const_iterator iter = strNumbers.begin(); iter != strNumbers.end(); ++iter)
{
individualDigits.push_back(*iter - 48);
}
Promatrano iz kategorije složenosti bolji je drugi.
Prostorna i vremenska složenost za oba načina su iste, a konstanta u vrhu složenosti je manja za drugi, pogotovo što prvi ima i pridruživanje, koje traje dulje od oduzimanja.
Imam problem , kako da ispisem varijablu Vektor v?
Evo i kod :
#include <iostream>
using namespace std;
class Vektor
{
private:
double ax,ay;
public:
Vektor();
Vektor(double a, double b) { ax=a; ay=b;}
double DajX() { return ax;}
double DajY() { return ay; }
};
Vektor::Vektor()
{
ax=0;
ay=0;
}
int main()
{
Vektor v(5,6);
}
Imam problem , kako da ispisem varijablu Vektor v?
Evo i kod :
// ... //
int main()
{
Vektor v(5,6);
return 0;
}
Kako god ti hoces. Mozes napisati posebnu metodu za ispis, koju pozivas nad svojim Vektor objektom, a mozes i preopteretiti operator <<. U mainu ti fali return 0;
Kad napravim metodu za ispis izbaci mi error " 'Ispis' was not declared in this scope"
#include <iostream>
using namespace std;
class Vektor
{
private:
double ax,ay;
public:
Vektor();
Vektor(double a, double b) { ax=a; ay=b;}
double DajX() { return ax;}
double DajY() { return ay; }
double Ispis(double a);
};
Vektor::Vektor()
{
ax=0;
ay=0;
}
double Vektor::Ispis(double a)
{
return a;
}
int main()
{
Vektor v(5,6);
Ispis(v);
return 0;
}
Kad napravim metodu za ispis izbaci mi error " 'Ispis' was not declared in this scope"
class Vektor
{
// ... //
void Ispisi();
}
// ... //
void Vektor::Ispis()
{
cout << DajX() << " " << DajY();
}
int main()
{
Vektor v(5,6);
v.Ispis();
return 0;
}
Opcenito, metode koje samo ispisuju nesto su void tipa, jer ne trebaju nista vracati, zato void Vektor::Ispis().
Ispis se vrsi klasicno cout objektom, ti si ga jos prilagodi kako zelis da ti izgleda, ovo je ugrubo.
Poziv metode nad objektom se vrsi na sljedeci nacin: ime_objekta.ime_metode(argumenti).
Hvala puno .
Pozdrav,
Jasno mi je da dat.close() i dat.clear() nije isto ali sto tocno radi ovaj dat.clear() i zasto ga koristiti/ne koristiti ?
Može li mi itko reći za što se koristi kopirni instruktor i ako možete dati koji primjer :)