Avatar billede bentblod Nybegynder
06. januar 2005 - 15:08 Der er 22 kommentarer og
1 løsning

Arbejde med objekter

Er stadig rimelig ny til c++, men vil gerne lige vide hvordan man arbejder med objekter, hvis vi nu siger jeg har et container objekt af en klasse som hedder bil, og i min klasse som jeg kalder constructor skal der være en metode som f.eks. hedder:

udskrivBil den skal så have et bil objekt med, det jeg har prøvet indtil videre ser sådan her ud:

void udskrivObjekt(Bil bil){
}
Men brokker den sig over. Hvordan er det man gør det her?
Avatar billede rbj_fp Nybegynder
06. januar 2005 - 15:20 #1
Altså I klasse Bil vil du have metoden: void udskrivObjekt(Bil bil)?

eller har du en anden klasse som har denne metode?
Avatar billede bentblod Nybegynder
06. januar 2005 - 15:21 #2
nej vil have metoden i en anden klasse, så jeg kan arbejde videre på objektet i den klasse :) klassen hedder Controller, der hvor den metode skal være i.
Avatar billede arne_v Ekspert
06. januar 2005 - 15:24 #3
class Controller
{
    ...
    void udskrivObjekt(Bil bil);
    ...
};

void Controller::udskrivObjekt(Bil bil)
{
  ...
}
Avatar billede rbj_fp Nybegynder
06. januar 2005 - 15:25 #4
kk.... fattede det ikke lige.

Typisk vil du oprette et objekt i en metode og i en anden metode tilgå det objekt.

Metode1()
{
    Bil bil; // opretter objektet
    udskrivObjekt(bil); // kalder metoden
}

udskrivObjekt(Bil &bil)
{
}

burde virke... Her opfatter en reference til dit oprettede objekt
Avatar billede bentblod Nybegynder
06. januar 2005 - 15:29 #5
Hmm glemte lige det med Controller:: stupid me... Men den melder så stadig fejl, prøver lige at copy paste koden til Controller klassen:

----------Controller.cpp-------------

#include "controller.h"
#include "filhaandtering.h"
#include"bil.h"

Controller::Controller(void) {}

Controller::~Controller(void) {}

void Controller::skrivTilFil(char text[], int size){
  Filhaandtering fh;
  fh.skrivTilFil(text,size);
}

string Controller::laesFraFil(){
  Filhaandtering fh;
  string tekst = fh.laesFraFil();
  return tekst;
}

void Controller::udskrivObjekt(Bil bil){

}

-------Controller.h----------------

#include <iostream>
#include <string>

using namespace std;

class Controller{
  private:

  public:
  Controller();
  ~Controller();
  void skrivTilFil(char text[], int size);
  string laesFraFil();
  void udskrivObjekt(Bil bil);
};
Avatar billede arne_v Ekspert
06. januar 2005 - 15:35 #6
Skal du ikke have en

#include"bil.h"

i Controller.h ?
Avatar billede bentblod Nybegynder
06. januar 2005 - 15:41 #7
nu siger den:
body has allready been defined for function intToString<T>(T) at line 7
Multiple declaration for 'Bil' at line 15
earlier declaration of 'Bil' at line 14.

Kræver vel også jeg copy paster Bil klassen så.

-------Bil.h-----------

#include <iostream>
#include <string>
#include <sstream>

template <typename T>
std::string intToString(T t)
{
  std::stringstream ss;
  ss << t;
  return ss.str();
}

using namespace std;
class Bil
{
private:
  string navn;
  int maxFart;
  int pris;
public:
  Bil(void);
  Bil(string navn,int maxFart,int pris);
  ~Bil(void);
  void setNavn(string navn);
  void setMaxFart(int maxFart);
  void setPris(int pris);
  int getPris();
  int getMaxFart();
  string getNavn();
  string toString();
};

----------bil.cpp---------------

#include"bil.h"
#include"controller.h"
#include <sstream>
#include <string>
#include <iostream>


template <typename T>
bool FromString(T &aRes, const std::string &aStr)
{
  std::stringstream ss(aStr);
  return ss >> aRes;
}

std::string Split(std::string &aSrc, char aDelim)
{
  if(aSrc.empty())
      return "";
  std::string::size_type pos = aSrc.find(aDelim);
  std::string T = aSrc.substr(0, pos);
  if(pos != std::string::npos)
    aSrc = aSrc.substr(pos + 1);
  else
    aSrc = "";
  return T;
}


int main(){
  Controller controller;
  Bil min_bil;
  min_bil.setMaxFart(250);
  min_bil.setNavn("Bilen");
  min_bil.setPris(200000);

  int uPris = min_bil.getPris();
  int uMaxFart = min_bil.getMaxFart();
  string uNavn = min_bil.getNavn();
  string uTekst = min_bil.toString();
  std::cout << "Navn: " << uNavn << std::endl;
  std::cout << "Max fart: " << uMaxFart << std::endl;
  std::cout << "Pris: " << uPris << std::endl;
  std::cout << "toString: " << uTekst << std::endl;

  Bil min_bil2("bil2",200,120000);
  string y = min_bil2.toString();
  std::cout << "toString2: " << y << std::endl;

//  char txt[] = "Denne tekst skrives til en fil";

  char *x = new char[y.size() + 1];
  strcpy(x, y.c_str());
  char v[200]; // nok er nok
  strcpy(v, y.c_str());
  delete [] x;

  controller.skrivTilFil(v,sizeof(v));
//  string tekst = controller.laesFraFil();
//  std::cout << tekst << std::endl;

//string til char[]
/*  std::string y = "Ole Nielsen";
  char *x = new char[y.size() + 1];
  strcpy(x, y.c_str());
  char v[1025]; // nok er nok
  strcpy(v, y.c_str());
  delete [] x;
  std::cout << "v: " << v << std::endl;
*/
//string til int
  std::string t("123");
  int i;
  FromString(i, t);
  std::cout << "i: " << i << std::endl;

//string til double
  double d;
  FromString(d, t);
  std::cout << "d: " << d << std::endl;

//string til float
  float f;
  FromString(f, t);
  std::cout << "f: " << f << std::endl;

//split
  std::string Test = "Bil,200,230.23";
  std::string Sub;
  while(!(Sub = Split(y, ',')).empty()){
    std::cout << Sub << std::endl;
  }

  return 0;
}
Avatar billede bentblod Nybegynder
06. januar 2005 - 15:42 #8
hov var lige den forkerte klasse jeg copy pastede :D

-------------bil.cpp---------------------

#include "bil.h"
using namespace std;


Bil::Bil(void) {}
Bil::Bil(string navn,int maxFart,int pris){
  this->navn = navn;
  this->maxFart = maxFart;
  this->pris = pris;
}
Bil::~Bil(void) {

}
void Bil::setMaxFart(int nMaxFart){
  this->maxFart = nMaxFart;
}
void Bil::setNavn(string nNavn){
  this->navn = nNavn;
}
void Bil::setPris(int nPris){
  this->pris = nPris;
}
string Bil::toString(){
  std::string tekst = navn + std::string(",") + intToString(maxFart) + std::string(",") + intToString(pris);
  return tekst;
}
int Bil::getPris(){
  return pris;
}

int Bil::getMaxFart(){
  return maxFart;
}

string Bil::getNavn(){
  return navn;
}
Avatar billede arne_v Ekspert
06. januar 2005 - 15:45 #9
Bil.h bør have:

#ifndef BIL_H
#define BIL_H

indhold

#endif

så du undgår problemer med at den bliver inkluderet 2 gange
Avatar billede arne_v Ekspert
06. januar 2005 - 15:46 #10
template <typename T>
std::string intToString(T t)
{
  std::stringstream ss;
  ss << t;
  return ss.str();
}

skal nok være

template <typename T>
static std::string intToString(T t)
{
  std::stringstream ss;
  ss << t;
  return ss.str();
}
Avatar billede bentblod Nybegynder
06. januar 2005 - 15:48 #11
du mener at #endif skal være i bil.cpp ? eller hvad mener du med indhold?
Avatar billede arne_v Ekspert
06. januar 2005 - 15:52 #12
indhold = al eksisterende indhold af bil.h
Avatar billede bentblod Nybegynder
06. januar 2005 - 15:53 #13
Ok tar jeg som et ja så. Den melder denne fejl nu:


bcc32 -D_DEBUG -g100 -j25 -Od -r- -k -y -v -vi- -tWC -c -IC:\CBuilderX\include  -n"D:\c++ programmering\basic\windows\Debug_Build"  bil.cpp brugbil.cpp controller.cpp
Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland
bil.cpp:
"bil.h": E2187 Unexpected end of file in conditional started on line 4 at line 36
"bil.cpp": E2056 Misplaced endif directive at line 2
*** 2 errors in Compile ***
brugbil.cpp:
"bil.h": E2187 Unexpected end of file in conditional started on line 4 at line 36
"bil.h": E2187 Unexpected end of file in conditional started on line 4 at line 36
*** 2 errors in Compile ***
controller.cpp:
"bil.h": E2187 Unexpected end of file in conditional started on line 4 at line 36
"controller.cpp": W8057 Parameter 'bil' is never used in function Controller::udskrivObjekt(Bil &) at line 22
*** 1 errors in Compile ***
BCC32 exited with error code: 1
Build cancelled due to errors
Avatar billede arne_v Ekspert
06. januar 2005 - 15:58 #14
Må vi se bil.h igen med rettelsen
Avatar billede bentblod Nybegynder
06. januar 2005 - 16:06 #15
#include <iostream>
#include <string>
#include <sstream>
#ifndef BIL_H
#define BIL_H

template <typename T>
static std::string intToString(T t)
{
  std::stringstream ss;
  ss << t;
  return ss.str();
}


using namespace std;
class Bil
{
private:
  string navn;
  int maxFart;
  int pris;
public:
  Bil(void);
  Bil(string navn,int maxFart,int pris);
  ~Bil(void);
  void setNavn(string navn);
  void setMaxFart(int maxFart);
  void setPris(int pris);
  int getPris();
  int getMaxFart();
  string getNavn();
  string toString();
};
Avatar billede arne_v Ekspert
06. januar 2005 - 16:12 #16
Der mangler en #endif i bunden.
Avatar billede arne_v Ekspert
06. januar 2005 - 16:13 #17
Iøvrigt plejer man traditionelt at putte #include indenfor
Avatar billede arne_v Ekspert
06. januar 2005 - 16:13 #18
#ifndef BIL_H
#define BIL_H

#include <iostream>
#include <string>
#include <sstream>

template <typename T>
static std::string intToString(T t)
{
  std::stringstream ss;
  ss << t;
  return ss.str();
}


using namespace std;
class Bil
{
private:
  string navn;
  int maxFart;
  int pris;
public:
  Bil(void);
  Bil(string navn,int maxFart,int pris);
  ~Bil(void);
  void setNavn(string navn);
  void setMaxFart(int maxFart);
  void setPris(int pris);
  int getPris();
  int getMaxFart();
  string getNavn();
  string toString();
};

#endif
Avatar billede bentblod Nybegynder
06. januar 2005 - 16:18 #19
ahh nice nu virker det som det skal :)

Skriv lige som svar^^
Avatar billede bentblod Nybegynder
06. januar 2005 - 16:20 #20
men hvad betyder:
#ifndef BIL_H
#define BIL_H

og #endif egentlig?
Avatar billede arne_v Ekspert
06. januar 2005 - 16:20 #21
svar
Avatar billede arne_v Ekspert
06. januar 2005 - 16:22 #22
#ifndef BIL_H
#define BIL_H

"noget"

#endif

gør at du kan lave

#include "bil.h"

flere gange men at "noget" alligevel kun kommer med en gang.

ifndef = if not defined
Avatar billede bentblod Nybegynder
06. januar 2005 - 16:23 #23
Ok tak for hjælpen endnu engang :)
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