TobiasMedlem sedan jan. 200133 inlägg Om man har en int-array *p i egen klass:
class vect {
public :
...
int& element (int i); // access p[ ]
...
private :
int* p;
int size;
}
då kan man kolla och tilldela p mha minVektor.element(i) = x;
- här verkar det skilja från Java. Tilldelningen returnerar ju inget. Vad händer? Se metoden:
int& vect :: element (int i) {
assert (i >= 0 && i < size);
return p;
}
------------------
Med vänliga hälsningar
Tobias Bohlin
UlfTMedlem sedan maj 20018 027 inlägg
Tilldelningen returnerar ju inget.
Vad menar du att tilldelningen ska returnera? Du får väl en referens till ett element som du kan sätta till x? Du har väl kommit ihåg att allokera minne åt pekaren p? Förslagsvis minne tillräckligt åt size antal element.
TobiasMedlem sedan jan. 200133 inlägg Nej, det var inte riktigt rätt. Har emellertid annat problem. Klassen vect har konstrutktor och destruktor. Jag håller på och filar på en metod för att:
// adds two vectors into a third v(implicit) = v1 + v2
Metoden har argumenten const& v1, const& v2. Det första jag gör är:
vect (v1.ub() + v2.ub() + size + 2)
där ub ger size - 1 (arrayens övre bound = sista elementet), size är storleken på implicit vektor, +2 för att få rätt storlek på nya implicita vektorn, fom nu refererad till som v. När detta körs, körs destruktorn för v. Kanske därför så uppdateras inte size till nya storleken. Konstruktorn vect ser ut så här:
vect :: vect (int n) : size (n) {
p = new int ;
}
Såvitt jag fattar så uppdateras size i metodhuvudet. En annan sak som är lurig är att jag kan lägga till element ändå (kanske relaterat till memory-poolen för programexekveringen, unik för mitt pgm). Om jag lägger till, efter vect (v1.ub() + v2.ub() + size + 2); :
size = v1.ub() + v2.ub() + size + 2;
så får jag rätt size.
Jag testade att istället för att anropa konstruktorn i min metod, direkt uppdatera p:
p = new int ;
- precis som i konstruktorn, fast kräver att man också (före):
size = v1.ub() + v2.ub() + size + 2;
Skillnaden är att nu sätts alla gamla element (i v) till nollor. Tyckte det verkade bra att de behålls (mindre kod). Som sagt, jag har väl en unik memory pool till mitt förfogande? Kan det bli problem?
------------------
Med vänliga hälsningar
Tobias Bohlin
[Redigerat av Tobias den 09 sep 2001]
[Redigerat av Tobias den 09 sep 2001]
Kanske jag som är trött, men det skulle underlätta om du klipper in ett helt körbar exempel med kod-formattering påslagen ( http://program.webforum.nu/wf/ubbcode.html ). Inte ointresserad, men det är för mycket text för att jag ska orka läsa ;-)
UlfTMedlem sedan maj 20018 027 inlägg Ditt resonemang såg minst sagt krångligt ut. Om du vill kunna addera två vektorobjekt och få ett tredje vektorobjekt, fundera på att använda overloaded operators i så fall. Vad det handlar om är att definiera om operatorer, tex +, för en viss klass. Du skulle kanske vilja ha följande overloaded operator:
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">vect operator+(vect enVektor);
// Kan sedan köras på två sätt
nyVektor = dinVektor + enVektor;
// eller
nyVektor = dinVektor->operator+(enVektor);När det gäller hur size ska uppdateras, hänger jag inte med i ditt resonemang. Vid vektoraddition är för övrigt size konstant. Du kan inte addera vektorer av olika dimensioner.
När det gäller minne så måste du allokera minne åt de pekare som du använder, såvida du inte pekar dem mot redan allokerat minne. Du kan allokera din int-array på följande sätt:<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">p = new int;
// eller redan i deklarationen
int p; // Ja, du får en pekare till första elementet i en arrayVisst ger operativsystemet dig en minnespool. Genom att allokera minne så som man ska frågar du os om minne, och får då minne från poolen. Om du inte allokerade minne, skulle pekarna peka helt slumpmässigt på den minnesadress som händelsevis råkar stå där i pekaren just då. Vad som står där är helt slumpmässigt (beror på vad just det minnesutrymmet har använts till tidigare, det kanske inte ens var en minnesadress det var tänkt som) och kan mycket väl peka på ett minnesblock i något annat programs minnespool.
TobiasMedlem sedan jan. 200133 inlägg #include <iostream>
#include "vect1.h"
int main () {
vect a(3);
for (int i = 1; i < 4; i++) {
a.element(i-1) = i;
}
cout << "Summa" << endl;
cout << a.sumelem() << endl;
cout << "Innehåll" << endl;
a.print();
// här kommer add two vectors into implicit (dvs a)
vect b(3), c(3);
b.element(0) = 99;
// b.element(1) = 4;
// b.element(2) = 5;
// c.element(0) = 6;
// c.element(1) = 7;
// c.element(2) = 8;
a.add(b, c);
cout << "a:s innehåll efter add" << endl;
a.print();
// följ. eftersom det är skillnad på om jag endast anropar vect i vect :: add, eller sätter size raden efter
cout << "test, a:s size ska vara 9 är: " << a.ub() + 1 << endl;
}
vect1.h:
// Implementation of a safe array type vect
#include <assert.h>
class vect {
public :
explicit vect (int n = 10);
~vect () {
cout << "destructor invoked" << endl;
delete [ ] p;
}
int& element (int i); // access p []
int ub () const { // upper bound
return (size - 1);
}
int sumelem ();
void print ();
void add (const vect& v1, const vect& v2);
private :
int* p;
int size;
};
vect :: vect (int n) : size (n) {
assert (n > 0);
p = new int [size];
assert (p != 0);
}
int& vect :: element (int i) {
assert (i >= 0 && i < size);
return p[i];
}
int vect :: sumelem () {
int i, sum = 0;
for (i = 0; i <= ub(); ++i) {
sum += p[i];
}
return sum;
}
void vect :: print () {
for (int i = 0; i <= ub(); ++i) {
cout << "p[" << i << "] = " << element(i) << endl;
}
}
// adds two vectors into a third v(implicit) = v1 + v2
// det ska vara mer här men kört fast på det första
void vect :: add (const vect& v1, const vect& v2) {
int i = 0;
vect (v1.ub() + v2.ub() + size + 2);
size = v1.ub() + v2.ub() + size + 2; // borde vara onödigt
}
Med vänliga hälsningar
Tobias Bohlin
PS. När jag lärde mig Java fick jag lära mig att klasser ska skrivas med stor bokstav. Vad gäller i C++? DS
[Redigerat av Tobias den 15 okt 2001]