Gå til innhold

Bone's Offisielle C++ hjelpetråd


Anbefalte innlegg

Videoannonse
Annonse
Gjest Gjest slettet-ld9eg7s96q

Senere når du føler for å bevege deg over til et litt mer avansert oppsett kan du eksperimentere litt med GUI programmering. Jeg har snekret sammen en dialogboks for deg med bruk av QT rammeverk:

 

WNyAatY.png

 

mainwindow.h:

 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <cmath>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private slots:
void on_pushKalkuler_clicked();
private:
Ui::MainWindow *ui;
double kalkulerBMI(double lengde, double vekt);
QString hentResultatText(double bmi);
};
#endif // MAINWINDOW_H

 

mainwindow.cpp:

 

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow) {
ui->setupUi(this);
ui->labelResultat->hide();
ui->labelResultatData->hide();
}
MainWindow::~MainWindow() {
delete ui;
}
void MainWindow::on_pushKalkuler_clicked() {
ui->labelResultatData->setText(
			hentResultatText(
				kalkulerBMI(
					ui->lineLength->text().toDouble(),
					ui->lineWeigth->text().toDouble()
					)));
ui->labelResultat->show();
ui->labelResultatData->show();
}
double MainWindow::kalkulerBMI(double lengde, double vekt) {
return vekt / pow(lengde / 100, 2);
}
QString MainWindow::hentResultatText(double bmi) {
if (bmi < 18.5) {
	return "Du er undervektig";
} else if (bmi > 18.5 && bmi < 24.9) {
	return "Du har normalvekt";
} else if (bmi > 24.9 && bmi < 29.9) {
	return "Du er overvektig";
} else if (bmi > 29.9 && bmi < 34.9) {
	return "Du faller under kategorien fedme";
} else if (bmi > 34.9 && bmi < 39.9) {
	return "Du faller under kategorien diger";
} else {
	return "Ditt fleskeberg!!";
}
}

 

main.cpp:

 

#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
MainWindow w;
w.show();

return a.exec();
}

 

Kildekoden kan du laste ned her: https://dl.dropboxus...ikalkulator.zip

 

QT kan du laste ned her:

 

http://qt-project.org/downloads

Lenke til kommentar
Gjest Gjest slettet-ld9eg7s96q

Det må jeg få til :) Skal gjøre ferdig kalkulatoren først, er ikke helt fornøyd enda.

 

Finnes det andre programmer for å lage 2D-programmer?

 

QT er ikke et program, det er et rammeverk - en samling biblioteker du bruker som et verktøy for å kode GUI applikasjoner i C++. Det finnes mange andre rammeverk i C++, deriblant GTK+, WxWindows og MSFC, men QT er etter min mening det beste, enkleste og mest komplette alternativet.

 

QT har også en del 3D rutiner og fungerer utmerket sammen med OpenGL.

Endret av Gjest slettet-ld9eg7s96q
Lenke til kommentar

Da var det klasser som står for tur.. Noen som er gode på å forklare det? Tanken er at siden mitt begynnerprosjekt er en kalkulator, så burde jeg få "classes and objects" in her. Jeg sliter med å få funksjoner til å bli godkjent i int main().

 

 

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

class minklasse{
public:
 int getrart(){
  return rart;
 }
private:
 int rart(){

  int a;
  int b;
  int sum;

  cout << "Hva er a?" << endl;
  cin >> a;
  cout << "Hva er b?" << endl;
  cin >> b;
  sum = a+b;
  cout << "Til sammen blir dette " << sum << endl;

  return 0;


 };
};
int main(){

minklasse meg;
meg.getrart;
cout << meg.getrart();

cin.get();
return 0;
}

 

Veldig enkelt bygd, men hvor bør jeg skrive inn funksjonen/utregningen, osv. Hvordan bør slikt gjøres?

 

Dette er altså ikke kalkulatoren min, men jeg tester i dette vedlegget før jeg gjør det videre i kalkulatoren min.

Endret av Svigermors drøm
Lenke til kommentar

Jeg vet ikke hvordan kalkulatoren din skal bli, men slik det er nå så er det ingen spesiell grunn til å legge den i en klasse (dette er da ikke Java :p). Det er heller ingen grunn til at du har kalkulatormetoden privat når det eneste getrart gjør er å kalle den uansett.

Lenke til kommentar

Det kan stemme, dette er mest for å lære meg klasser.

 

Hva er grunnen til dette med private og public?

 

Public funksjoner brukes dersom du tillater at en bruker gjør endringer på et objekt/instanse av klassen. Dersom du har private funksjoner har ikke brukeren tilgang til funksjonen. Private funksjoner kan bare kalles innad i klassen.

 

En private funksjon kan forsåvidt kalles av alle andre funksjoner innenfor samme klasse.

Så: Dersom du ikke vil at en bruker skal ha tilgang på en funksjon settes den som private.

 

Et dårlig psuedokode-eksempel, men håper du skjønner tegningen ;)


//HOVEDFUNKSJONEN
main()
{
Klassenavn instance; //instanse av klassen Klassaenavn

  instance.eksempel();   //Dette er lov siden funksjonen er public.
  instance.something()   //Compile-error siden funksjonen er private.


}

//EN KLASSE MED NAVN Klassenavn
public Klassenavn::eksempel()
{
  this.something(); //Dette er lov siden funksjonen something() er under samme klasse som eksempel()

}

private Klassenavn::something()
{

}

 

Med tanke på klasse-medlemmer som f.eks int, char, arrays osv så settes de private slik at en bruker ikke kan sette dem direkte. Anta at integeren myInteger under er private.

 


myInteger = 1; //Ikke lov siden den er private.

public void Class::set_my_integer(int newValue)
{
  myInteger = newValue //Dette er lov siden set_my_integer() er public og myInteger (liksom) er en klasse-medlem av denne klassen.
}

 

Står masse om dette rundt omkring, f.eks her http://uk.answers.yahoo.com/question/index?qid=20120123081148AAxdgeG

Endret av Nickless
Lenke til kommentar

Kay, godt fortalt :)

 

Er dette riktig bruk av public og private?

 

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

class hurtighet{
public:
 int getfart(){
  return fart();
 }
private:
 int fart(){

  int valg2;
  int valg3;

cout <<"Hvilken enhet har du?" << endl;
cout <<"Knop = 1" << endl;
cout <<"Miles per hour = 2" << endl;
cout <<"Kilometer i timen = 3" << endl;
cin >> valg2;
cout <<"Hvilken enhet vil du ha?" << endl;
cout <<"Knop = 1" << endl;
cout <<"Miles per hour = 2" << endl;
cout <<"Kilometer i timen = 3" << endl;
cin >> valg3;


if(valg2 == 1 && valg3 == 2){
 double valg4;
 cout <<"Hvor mange knop?" << endl;
 cin >> valg4;
 cout << valg4 << " Knop, er: " << valg4 * 1.1507784 <<" Miles per hour" << endl;
}
else if(valg2 == 1 && valg3 == 3){
 double valg5;
 cout <<"Hvor mange knop?" << endl;
 cin >> valg5;
 cout << valg5 << " Knop, er: " << valg5 *  1.8519984 <<" Kilometer i timen" << endl;
}
else if(valg2 == 2 && valg3 == 1){
 double valg6;
 cout <<"Hvor mange Mp/h?" << endl;
 cin >> valg6;
 cout << valg6 <<" Mp/h, er: " << valg6 * 0.8689769 <<" Knop" << endl;
}
else if(valg2 == 2 && valg3 == 3){
 double valg7;
 cout <<"Hvor mange Mp/h?" << endl;
 cin >> valg7;
 cout << valg7 <<" Mp/h, er: " << valg7 * 1.609344 <<" Kilometer i timen" << endl;
}
else if(valg2 == 3 && valg3 == 1){
 double valg8;
 cout <<"Hvor mange Km/t?" << endl;
 cin >> valg8;
 cout << valg8 <<" Km/t, er: " << valg8 *  0.6213711 <<" Knop" << endl;
}
else if(valg2 == 3 && valg3 == 2){
 double valg9;
 cout <<"Hvor mange Km/t?" << endl;
 cin >> valg9;
 cout << valg9 <<" Km/t, er: " << valg9 *  0.6213711 <<" Miles per hour" << endl;
}

return 0;
 };
};
int main(){

hurtighet speed;
cout << speed.getfart();

cin.get();
return 0;
}

 

Som sagt er dette bare en test for å lære klasser :)

  • Liker 1
Lenke til kommentar

Som sagt er dette bare en test for å lære klasser :)

 

Yes, tankegangen din ser rett ut :) Siden du bare trikser og mikser for å lære nå så anbefaler jeg deg å bruke constructor når du lager instanser. Pluss at du burde alltid legge til en else{} i if-setninger. Man vet aldri når noe går galt, dvs dersom ingen av else if() slår til så vil programmet bare terminere. Derfor kan det være lurt med else{}. Med andre ord dersom ingen av testene slår til vil den gå inn i else{}.

 

else if(valg2 == 3 && valg3 == 2){
 double valg9;
 cout <<"Hvor mange Km/t?" << endl;
 cin >> valg9;
 cout << valg9 <<" Km/t, er: " << valg9 *  0.6213711 <<" Miles per hour" << endl;
}
else{

  cout << "Dette skulle egentlig ikke skje, men det skjedde uansett " << endl;
}

Lenke til kommentar

Da var det klasser som står for tur.. Noen som er gode på å forklare det? Tanken er at siden mitt begynnerprosjekt er en kalkulator, så burde jeg få "classes and objects" in her.

(...)

Vet ikke om jeg er så god på å forklare det, men hovedideen med objektorientering er at du samler data og metoder som hører sammen til ett objekt. La oss si at du f.eks. skal lage et enkelt 2D-spill. En hver ting/figur/etc. som beveger seg i det spillet vil da ha en x-koordinat og en y-koordinat, en høyde og en bredde, en hastighet i henholdsvis x- og y-retning, og for eksempel en array med pikslene som den består av (og sikkert mye mer). Det er da helt naturlig å linke alle disse størrelsene sammen til ett objekt. Da har du én ting å forholde deg til i stedet for at du selv må huske hvilken x-koordinat som hører til hvilken y-koordinat og så videre.

 

I tillegg skal objektet kanskje gjøre forskjellige ting, det kan f.eks. være at det skal gå an å rotere det, få det til å gjøre en eller annen animasjon, osv. Dette er operasjoner som er spesifikke for objektet og som gjør ting med det. Slike operasjoner er det også naturlig at er en del av objektet selv, og vi kaller dem for metoder.

 

Så kort sagt: et objekt består av variabler og metoder som gjør et eller annet relatert til objektet.

 

En klasse kan du tenke på som "malen" for hvordan et objekt skal se ut. Klassen beskriver variablene og metodene som et objekt skal bestå av. En klasse som beskriver de objektene jeg snakket om ovenfor vil f.eks. kunne se slik ut:

 

class Figur {
 private:
int x, y, b, h;  // koordinater og bredde, høyde
float hx, hy;  // hastigheter
char* piksler;
 public:
void plasser(int ny_x, ny_y);
void roter(blabla);
void animer(blabla);
void flytt(int dx, int dy);
}

 

Når vi da skriver

Figur a;
Figur b;

vil vi opprette to separate figurer (vi kaller disse instanser av klassen Figur), a og b, som begge har de bestanddelene som var definert i klassen. De vil ha hver sine x-, y-koordinater og så videre, og hvis vi kaller

a.roter()

så vil a roteres, uten at det skjer noe med b.

 

Dette er hovedideen, men objektorientering dreier seg om mye mer. Jeg syns det er ok oppsummert på disse sidene her.

Lenke til kommentar

Nei. OO handler om message passing.

 

Ja, objektorientering er mer enn "objekter med variabler og metoder", men motivasjonen (for nybegynnere) for å benytte klasser er vel nettopp å samle data og kode som hører sammen på den måten.

Lenke til kommentar

Det er jeg uenig i, og det gir oss en endeløs strøm av middelmådige Java-programmere.

 

Objektorientering er vanskelig. Motivasjonene for å gjøre det er mange og gevinstene er tidvis utrolig store. Men klassene/objektene har aldri vært hovedidéen i OO (ironisk nok :>).

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...