Hantera instans- och klass-variabler

Publicerad 2009-05-24 21:41

Fråga

Jag är nybörjare i C++ (försöker lära mig själv och köpt två stora böcker - en på svenska och på eng plus skaffat lite material om detta samt nätet förstås). Jag jobbar med kompilator, Qt - DOS-konsol, ingen grafik alltså.

Just nu håller på en liten utmanade för mig uppgift och följer "krav-spec" från uppgiftgivare (material från en vekant). Uppgiften går ut på hantera dynamiska objekt, där man måste skapa ett objekt för hörnen av en polygon (x och y) och sen skapa ett annat objekt för beräkningarna, det andra objekt heter polyg. hornen.h ser ut så är:

#ifndef HORNEN_H

#define HORNEN_H

class Hornen {

private:

int x; int y;

double yta;

public:

Hornen(); // Egen defaultkonstruktor

Hornen(int px, int py); // Konstruktor

~Hornen(); // Destruktor

void hornUtsk(); // Tänkt att skriva ut x och y

friend class Polyg;

};

#endif

Hornens-implementationsfilen:

#include "hornen.h"

#include <iostream>

using namespace std;

Hornen::Hornen() : x(0), y(0) {}

Hornen::Hornen(int px, int py) : x(px), y(py) {}

Hornen::~Hornen() {}

void Hornen::hornUtsk() {

cout << "X=" << x << endl;

cout << "Y=" << y << endl;

}

Polyg-deklarationsfilen:

#ifndef POLYGON_H

#define POLYGON_H

#include "hornen.h"

class Polyg {

private:

Hornen *Hn; int storlek;

public:

Polyg();

Polyg(Hornen *arrHor, int cant);

Polyg(const Polyg &pgr); // Kop.konstruktor

const Polyg & operator=(const Polyg & Parr); // Tildelningsoperaton

Hornen & operator[](int index) { return Hn[index]; } // Indexeringsoperatorn

Hornen operator[](int index) const { return Hn[index]; } // Indexeringsoperatorn

~Polyg();

void add(int *arrh);

double polarea();

int minx();

int maxx();

int miny();

int maxy();

int numVert();

void polUtskrift();

};

#endif

Polyg-implementationsfilen:

#include "polyg.h"

#include <iostream>

using namespace std;

Polyg::Polyg() : Hn(0), storlek(0) {}

Polyg::Polyg(Hornen *arrHor, int cant) : storlek(cant) {

Hn = new Hornen[storlek];

for (int ix=0; ix<storlek; ix++) {

Hn[ix] = arrHor[ix];

}

}

Polyg::Polyg(const Polyg &plgr) : storlek(plgr.storlek) {

Hn = new Hornen[storlek];

for (int ix=0; ix<storlek; ix++) {

Hn[ix] = plgr.Hn[ix];

}

}

Polyg::~Polyg() {

delete[] Hn;

}

void Polyg::add(int *vtx) { }

double Polyg::polarea() { }

int Polyg::minx() { }

int Polyg::maxx() { }

int Polyg::miny() { }

int Polyg::maxy() { }

int Polyg::numVert() { }

void Polyg::polUtskrift() {

for (int ix=0; ix<4; ix++) {

cout << "" << ix << "- " << endl;

}

cout << endl;

}

Svar

Hej,

t.ex. kan du anropa hornUtsk på det här sättet:

void Polyg::polUtskrift() {
for (int ix=0; ix<storlek; ++ix) {
cout << " " << ix << "- " << endl;
Hn[ix].hornUtsk();
}
cout << endl;
}

Du kan även komma åt klassen Hornens privata data ifrån klassen Polyg eftersom du deklarerat denna klass som friend. T.ex. skulle du kunna skriva:

cout << "X=" << Hn[ix].x << endl;

i Polyg::polUtskrift() funktionen.

Angående variabeln yta så är den en instansvariabel. Hornen::yta skulle fungera om variabeln var deklarerad som static, d.v.s om att alla instanser delar på samma variabel. Som den är deklarerad nu behöver du en instans av klassen för att kunna komma åt den, t.ex. Hn[0]->yta.

http://en.wikipedia.org/wiki/Instance_variable

http://en.wikipedia.org/wiki/Class_variable

En bättre idé skulle dock vara att lägga variabeln i klassen Polyg istället, då det är ytan av polygonen du vill beräkna.

http://en.wikipedia.org/wiki/Model-view-controller

Tillsist ändrar du variabel värdena i polyg på det här viset,

Hornen Hn[3], H(1,2);
Polyg P(Hn, 3);
P[2] = H;

Lycka till.

On
Off

0 kommentarer

Avatar

Inte inloggad

Logga in Bli medlem

Läs mer

  • Senaste
  • Mest läst
  • Mest kommenterat

Kom in i diskussionen

Detta innehåll är skapat av Datormagazins besökare

Bildvisare utan bling-bling?

5 kommentarer

Tulum: ACDSee32 v. 2.4 fr. 1998 är den bästa bildvisaren.

Månadens fråga

  • Äger du en datorplatta?

Forum

Detta innehåll är skapat av Datormagazins medlemmar.

Artikelkommentarer


För dig som vill veta mer: prenumerera

Datormagazin är datortidningen för dig som vill veta mest. Vår ambition är att göra en tidning med djupare och mer avancerade artiklar än vad du hittar i andra datortidningar. Samtidigt väjer vi inte för att på ett handfast sätt förklara hur saker och ting fungerar. Du ska alltid känna att du har nytta av tidningen.
Välkommen till Sveriges största tidskrift för avancerade datoranvändare!

Beställ prenumeration och betala direkt online

Egmont logo
© Egmont Tidskrifter