Gå til innhold

Bone's Offisielle C++ hjelpetråd


Anbefalte innlegg

Videoannonse
Annonse
  • 2 uker senere...

Hei! Jeg regner meg selv som nybegynner, å poster dette derfor her.

 

Jeg trenger hjelp med syntaksen for å overlagre en arvet funksjon(fra en klasse) der jeg fortsatt vil bruke den gamle funksjonen i den nye.

 

En forenklet utgave av de to klassene:

 

#include <string>
#include <cmath>
#include <string>
#include <sstream>

using namespace std;

#define PI 4.0 * atan(1.0)

class Shape 
{
public:
Shape(string color, string line); //Konstruktør(duh
//Definisjoner her {...}
string toString();	//<--Funksjonen som skal overlagres.
private:
string color;
string line;
};

class Rectangle : public Shape
{	 
public:
Rectangle(string color, string line, double width, double height);
//Definisjoner her{...}
string toString(); //<--Funksjonen som skal overlagres.
private:
double width;
double height;
};

//Denne funksjonen returnerer en string med all nødvendig info om et Shape-objekt
string Shape::toString(){
stringstream ss;
ss << "Color = " << color << ", Line = " << line;
return ss.str();
}

 

Øvingsoppgaven sier jeg skal overlagre toString() som Rectangle arvet fra Shape, men bruke toString() fra Shape likevel, bare legge til tilleggsfunksjonalitet. Altså skrive ut width og length også.

 

Hvordan skal

string Rectangle::toString();

se ut for å få til dette?

 

takk på forhånd :)

 

Edit: Fant det ut selv.

 

string Rectangle::toString(){
stringstream ss;
ss << Shape::toString() << ", Width = " << width << ", Length = " << length;
return ss.str();
}

Endret av knutanha
Lenke til kommentar

Shape::toString()

Hmm, må ikke Shape::toString() være deklarert som static for at man skal kunne kalle på den måten, eller går dette hvis funksjonen kalles fra et objekt som arver fra Shape?

 

Det kan virke som om det siste stemmer. Det jeg skrev kompilerer/virker ihvertfall i Visual C++(med tilhørende kompilator).

Lenke til kommentar

Hei! Jeg regner meg selv som nybegynner..<snip>

 

Ettersom du regner deg selv som en nybegynner må jeg bare pirke/kommentere at du bruke 'using namespace std' i noe jeg regner med er en header.

 

Det er noe du ikke burde gjøre ettersom dette fort kan spre seg til store deler av programmet og da har du i praksis ødelagt poenget med namespace.

Lenke til kommentar
Ettersom du regner deg selv som en nybegynner må jeg bare pirke/kommentere at du bruke 'using namespace std' i noe jeg regner med er en header.

 

Det er noe du ikke burde gjøre ettersom dette fort kan spre seg til store deler av programmet og da har du i praksis ødelagt poenget med namespace.

 

Ja, det jeg postet her var en blanding av en headerfil(definisjonene) og koden til de ulike funksjonene(som lå i en .cpp fil med samme navn).

 

Opprinnelig i .h-filen brukte jeg kun std::-tags der jeg trengte det. En ting jeg lurer på er om det er best å skrive alle f.eks. string-variabler som

std::string

, eller om jeg heller burde bruke

using std::string;

øverst.

 

Edit: Når jeg tenker meg om er det vel best å bruke std::-tags for å hindre spredning.

Endret av knutanha
Lenke til kommentar

// 290310 Test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;
int main()
{
cout << "Would you like to have meat or bird for dinner tonight? ";
string food;
cin >> food;
cin.ignore();
cout << "I'd also like to have " << food << " tonight!" << endl << endl;
cout << "Do you want it medium cooked, or rare? ";
string cooked;
cin >> cooked;
cin.ignore();
cout << "Alright, let's have the " << food << " " << cooked << " cooked." << endl << endl;
cout << "I'm in a mood for a drink! What kind of drink would you like to have? ";
string drink;
cin >> drink;
cin.ignore();
cout << "Well, that sounds like a nice choise." << endl;
cout << "Let's have some " << drink << " with the " << food << "." << endl;
cin.get();
cin.get();
return 0;
}

 

En tilsynelatende enkel og grei kode, am I right?

Men har et lite problem (se vedlagt bilde). Det ene vinduet vil retten og sletten ikke bli krysset ut. Det går heller ikke ann å krysse det ut ved å bruke Ctrl-Alt-Del. Ingenting skjer. "Restart" eller "Shut Down" av PC'en fungerer heller ikke :ph34r: Eneste måten jeg kan få skrudd av PC'n er en hard restart (hold in teh button).

 

Om jeg åpner programmet flere ganger kommer det opp flere Console vinduer, men de kan jeg krysse ut av. Det er bare denne ene som "sitter fast" !!! :thumbdown: Herlighet, så irriterende. Er til å bli gal av.

 

Hva er det som feiler koden, eller for den saks skyld, PC'en/programmet? Dette er ikke til å bli klok av. Bakgrunnen på bildet (koden) brukte jeg som hjelp til å få til en cin >> name; bare.

 

Jeg bruker forresten Visual C++ 2008 Express Edition.

 

post-135592-1269892842,9879_thumb.jpg

Endret av Requi
Lenke til kommentar

Finner ikke noe galt i koden her og programmet fungerer utmerket.

Fungerer det å stoppe programmet fra vs (ved å trykke på stop knappen)?

Etter jeg hard-reset'et pc'en så har ikke dette skjedd. Men om dette skjer igjen (av en eller annen rar grunn) så skal jeg prøve dette, samt rapportere her! :)

 

Er i startfasen av å lære meg C++, og ser fram til å lære meg flere ting enn "Hello World" og slikt jeg laget nå nettopp :)

Lenke til kommentar
  • 4 måneder senere...

Søk "allegro mingw"

 

Dette ser ut som en lovende guide selv om den fokuserer på C::B.

http://wiki.allegro.cc/index.php?title=Code::Blocks

 

Du må laste ned 2 ting. Allegro og DirectX SDK-et. De komplette SDK-ene bruker å være store (400-500MB), det finnes minimale versjoner her:

http://alleg.sourceforge.net/wip.html

 

Edit: heh. rimelig seint av meg å svare. mr-taco har vel funnet ut av det for lengst ><

Endret av JAPCU
Lenke til kommentar
  • 3 uker senere...

Jeg har et kjapt spørsmål.

Holder på å lage 2-dim tabell med pekere, og overlasting av ().

Hvordan får jeg brukt () inne i samme objektet?

 

int& Matrise::operator()( int i, int j  ) {
if( i < rader && i >= 0 && j < kolonner && j >= 0 )
	return m[i][j];
else
	exit(1);
}

 

feks på

 

Matrise Matrise::operator =(const Matrise& rightSide) {

if (this!= &rightSide) //ulike objekter
{

	for( int i = 0; i < rader; ++i )
		delete [] m[i];
	delete [] m;

	rader 		= rightSide.rader;
	kolonner 	= rightSide.kolonner;
	opprettMatrise();

	for( int i = 0; i < rader; ++i ) {
		for( int u = 0; u < kolonner; u++ ) {
			this(i, u ) = rightSide(i, u ); // her
		}
	}
	return *this;
}



   return *this;

}

 

feilmelding

error: ‘this’ cannot be used as a function

Endret av Ståle
Lenke til kommentar

Leker meg litt med C++0x, men får ikke helt til noe med variadic templates.

 

Vil skrive en type-generisk adderer noe ala dette

 

#include <iostream>
using namespace std;

template <class T>
T sum(const T& in)
{
  return in;
}

template <class T, class... P>
auto sum(const T& t, const P&... p) -> decltype(t + sum(p...))
{
  return t + sum(p...);
}

int main()
{
  cout << sum(5, 10.0, 22.2) << endl;
}

 

sum() skal generisk summere alle elementene og returnere med typen som argumentene har når de blir summert.

Den funker for 1 og 2 argumenter, men med flere sier GCC at sum(int, double, double) ikke er definert osv. Jeg tror det er -> decltype(t + sum(p...)) som får den til å kødde siden p... har 2 argumenter i seg, men det bør være mulig for decltype å finne hvilken type sum(p...) har med rekursiv dedusering eller noe sånt. Noen som vet om decltype skal funke med variadiske argumenter? Hvis det er i standarden, er det GCC som ikke støtter dette enda?

Lenke til kommentar

Leker meg litt med C++0x, men får ikke helt til noe med variadic templates.

 

Vil skrive en type-generisk adderer noe ala dette

 

#include <iostream>
using namespace std;

template <class T>
T sum(const T& in)
{
  return in;
}

template <class T, class... P>
auto sum(const T& t, const P&... p) -> decltype(t + sum(p...))
{
  return t + sum(p...);
}

int main()
{
  cout << sum(5, 10.0, 22.2) << endl;
}

 

sum() skal generisk summere alle elementene og returnere med typen som argumentene har når de blir summert.

Den funker for 1 og 2 argumenter, men med flere sier GCC at sum(int, double, double) ikke er definert osv. Jeg tror det er -> decltype(t + sum(p...)) som får den til å kødde siden p... har 2 argumenter i seg, men det bør være mulig for decltype å finne hvilken type sum(p...) har med rekursiv dedusering eller noe sånt. Noen som vet om decltype skal funke med variadiske argumenter? Hvis det er i standarden, er det GCC som ikke støtter dette enda?

 

Du vil vel gjerne kalle sum<T, P> (eks. sum<double, double>) istedetfor bare sum.

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...