Avatar billede a_hald Nybegynder
22. maj 2003 - 23:57 Der er 6 kommentarer og
1 løsning

Vector problemer med .h fil og cpp fil

Er det en som der skal fortælle mig hvorfor jeg ikke kan få dette til at virke, det er denne linie som laver kage i det: varer = *varetemp;

Butik.h

using namespace std;
#include <string>
#include <vector>
#include "Vare.h"
#ifndef __Spiller__
#define __Spiller__
class Butik {
    private:
        string navn;
        vector <Butik> varer;
    public:
        Butik();//Constructor.
        Butik(string n);//Constructor overloaded.
        ~Butik();//Destructor
        string toString();
};
#endif

Vare.h

#ifndef __Spil__
#define __Spil__
class Vare{
    private:
        string navn;
    public:
        string toString();
        Vare(); //Constructor.
        Vare(string n);
        ~Vare();//Destructor.
};
#endif

Datalag.cpp

#include <iostream>
#include <string>
#include "Butik.h"
#include "Vare.h"

using namespace std;

Butik::Butik(){}
Butik::Butik(string n){
    vector<Vare> *varetemp = new vector<Vare>;
    varer = *varetemp;
}
Butik::~Butik(){}

Vare::Vare(){}
Vare::Vare(string n){
    navn=n;
}
Vare::~Vare(){}
Avatar billede a_hald Nybegynder
22. maj 2003 - 23:59 #1
Jeg får denne fejlmeddelse
c:\..\project 1\datalag.cpp: In method `Butik::Butik(basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> >)':
Avatar billede segmose Nybegynder
23. maj 2003 - 13:24 #2
Kunne du lige skrive resten af fejlmedelelsen, det ser ud til at du kun har skrevet hvor du får fejlen.

Derudover ser dette helt forkert ud, du har jo allerede
  vector <Butik> varer;
så hvorfor vil du allokere den igen i

Butik::Butik(string n){
    vector<Vare> *varetemp = new vector<Vare>;
    varer = *varetemp;
}
? så vidt jeg ved skulle det være unødvendigt.
Avatar billede segmose Nybegynder
23. maj 2003 - 14:19 #3
Eller hvad havde du tænkt dig at

Butik::Butik(string n){
    vector<Vare> *varetemp = new vector<Vare>;
    varer = *varetemp;
}

skulle gøre?
Avatar billede olennert Nybegynder
23. maj 2003 - 18:12 #4
Jeg er enig med segmose i at det ikke ser ud som særlig praktisk kode. Men jeg blev lidt nysgerrig, og prøvede følgende:

Butik::Butik(string n) {
    vector<Vare> varetemp; // Bemærk, ikke en pointer
    varer = varetemp;
}

og det giver (i hvert fald med g++) samme fejl. Jeg har ikke haft tid til at kigge nærmere på det, men synes det ser interessant ud. Særlig fordi jeg også har prøvet

int main() {
    vector<int> a;
    vector<int> b;
    a = b;
    return 0;
}

uden problemer......
Avatar billede segmose Nybegynder
24. maj 2003 - 18:03 #5
Jeg kunne tænke mig at det var noget copy constructor/destructor, den der string i Vare kræver vist en copy constructor, men vectoren skulle vel være tom så man ikke har behov for disse før man reelt kommer nogle Vare i? (nu er STL ikke min stærke side)
I olennert's exemple er der en klar forskel mellem simple type der ikke kræver noget speciel, men med komplekse typer kræves noget mere.
Avatar billede kvinther Nybegynder
02. juni 2003 - 19:10 #6
Jeg er enig med ovenstående. Nu du opretter en ny Butik, bliver 'varer' også oprettet, derfor kan/bør du ikke oprette den igen i constructoren.

Derfor er den umiddelbare løsning blot at fjerne

    vector<Vare> *varetemp = new vector<Vare>;
    varer = *varetemp;

fra 'datalag.cpp'. Det virker fint for mig.

Hvis du absolut vil lege med pointere, skal der i butik.h stå

    vector <Vare> *varer;

istedet. Herefter kan du addere vare til butikken med noget alla

    void Butik::nyVare(Vare *v) {
        varer.push_back(*v);
    }

eller hvis det ikke skal være med pointere

    void Butik::nyVare(Vare v) {
        varer.push_back(v);
    }
Avatar billede segmose Nybegynder
03. juni 2003 - 09:14 #7
kvinther jeg tror du har lidt rod i dine pointer.

#define MINSIZE (1000)

class Butik {
    private:
        string navn;
        vector <vare> *varer; // ændret fra butik til vare, da jeg ikke går ud fra at du vil have en butik med Butikker i. Pointer til vector.
    public:
        Butik();//Constructor.
        Butik(string n);//Constructor overloaded.
        ~Butik();//Destructor
        string toString();
        SetUp(int elements = MINSIZE);
};
Butik::SetUp(int elements) {
  varer = new vector<Vare>(elements); // Allokker plads til elements til at starte med.
}
Butik::Butik(){ SetUp() }
Butik::Butik(string n){
  SetUp();
  varer->push_back(new Vare(n));  // Opret butik med en vare??? eller
  navn = n; // Opret Butik med navn n
}
Butik::~Butik() {
  delete[] varer;
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis