Programmierung 2 - Seite 4

Neue Frage »

Auf diesen Beitrag antworten »
as_string

also:
Du hast doch das Rechteck definiert mit den beiden Eckpunkten. Da muss doch dann x von links nach rechts laufen und y von oben nach unten. Dann ist es doch logisch, dass Du die x Koordinate für den Start der äußeren for-Schleife aus dem Eckpunkt links (-unten) und die für das Ende der for-Schleife aus dem Eckpunkt recht (-oben) nehmen musst und nicht zweimal von demselben Eckpunkt.
Genau so für die y-Koordinate. Die Schleife muss doch von unten nach oben laufen, also nimmst Du die y-Koordinate vom unteren Punkt (was auch gleichzeitig der links ist, aber das spielt bei der y-Koordinate keine Rolle) und als Ende der Schleife dann halt die y-Koordinate des top...irgendwas Punktes.
Das ist doch wirklich einfachste Logik. Mit Programmieren hat das doch noch gar nichts zu tun! Sag doch bitte mal, was Du mit dem Rechteck, den Eckpunkten und so weiter immer noch nicht verstehst! Nimm doch nochmal das Übungsblatt und schau Dir die Zeichnung an wo die Eckpunkte und das Rechteck gezeichnet ist. Ich habe den Eindruck, Du hast immer noch überhaupt gar keine Ahnung, von was die Rede hier ist.

Was soll ich denn noch machen, ich hab das mit den Eckpunkten jetzt bestimmt schon zum 5ten-mal versucht zu erklären. Ich habe nicht das Gefühl, Du würdest auch nur ansatzweise irgendetwas verstehen. Sag doch bitte mal, wie siehst Du das denn?

Gruß
Marco
 
Auf diesen Beitrag antworten »
Victor

AH ok das mit dem hinlaufen der Koordinaten habe ich jetzt verstanden großes Grinsen

Ich habe jetzt bei der oberen for schleife beide getx genannt ,weil ja man nur die X Koordinate laufen lässt?

Also

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:


void CRectangle::draw(CScreen& screen) const
{
    for(int j = m_bottomLeft.getX(); m_topRight.getX()>=j;j++){

	for(int i = m_bottomLeft.getY();  m_topRight.getY()>=i; i++) {
	    screen.setPoint(j , i,´#`);




	}
    }
}


Müsste die obere X Koordinate nicht von oben nach unten laufen ?
War mir nicht sicher ob du dich verschrieben hast ?
Auf diesen Beitrag antworten »
as_string

Ist egal, ob man von oben nach unten von links nach rechts oder umgekehrt geht. Wir haben hier allerdings Zahlen. Wenn Du bei der kleineren Zahl anfängst (was hier wohl unten oder links entspricht), dann musst Du bis zur größeren hoch zählen (i++ bzw. j++), falls Du es unbedingt anders machen wolltest, dann müsstest Du halt runter zählen.
Alles was Du dann ändern würdest, wäre ja nur die Aufrufreihenfolge der setPoint() Mehtode. Die ist aber vollkommen egal, es ist nur wichtig, dass sie einmal für alle "Punkte" innerhalb des Rechtecks aufgerufen wird.
Du hast immer noch das Füllzeichen erstens mit den falschen Hochkommata geschrieben und vor allem brauchst Du auch gar keine Anführungszeichen, wenn Du einfach die Membervariable verwenden würdest, wie Du es so wie so tun musst.
Also bitte das fest angegebene Füllzeichen durch die entsprechende Membervariable der Klasse CRectangle ersetzen.

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:

void CRectangle::draw(CScreen& screen) const
{
    for(int j = m_bottomLeft.getX(); m_topRight.getX()>=j;j++){

	for(int i = m_bottomLeft.getY();  m_topRight.getY()>=i; i++) {
	    screen.setPoint(j , i,m_fillChar);   fehler?



	}
    }
}


Trotzdem noch ein Fehler ?

Description Resource Path Location Type
Invalid arguments '
Candidates are:
void setPoint(CPoint, char)
' CRectangle.cpp /CRectangle line 93 Semantic Error
no matching function for call to 'CScreen::setPoint(int&, int&, const char&)' CRectangle.cpp /CRectangle line 93 C/C++ Problem
candidate expects 2 arguments, 3 provided CScreen.h /CRectangle line 33 C/C++ Problem
candidate: void CScreen::setPoint(CPoint, char) CScreen.h /CRectangle line 33 C/C++ Problem
 
Auf diesen Beitrag antworten »
as_string

Ah, ok. Die Methode erwartet ein CPoint Objekt und nicht die beiden Koordinaten einzeln. Wie bekommst Du aus den beiden Koordinatenwerten i und j ein CPoint Objekt gebaut? Achte darauf, dass j die x-Koordinaten durchläuft und i die y-Koordinaten und der CPoint-Konstruktor entsprechend aufgerufen werden muss.

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:

void CRectangle::draw(CScreen& screen) const
{
    for(int j = m_bottomLeft.getX(); m_topRight.getX()>=j;j++){

	for(int i = m_bottomLeft.getY();  m_topRight.getY()>=i; i++) {
	    screen.setPoint(Cpoint(j , i,m_fillChar));




	}
    }
}


So? verwirrt
Auf diesen Beitrag antworten »
as_string

Also, ist ja schon näher dran...

Allerdings heißt die Klasse CPoint (großes P) und der Konstruktor von CPoint nimmt nur die beiden Koordinatenwerte als Argument, Du hast jetzt noch in die Klammer vom CPoint Konstruktor das Füllzeichen mit rein geschrieben. Sprich: die erste schließende Klammer muss vor dem Füllzeichen zu gehen.

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

Will es jetzt irgendwie testen

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:

// Header-Dateien
#include <iostream>		// Header für die Standard-IO-Objekte (z.B. cout, cin)
#include <stdlib.h>
// TODO: Fügen Sie hier weitere benötigte Header-Dateien der
// Standard-Bibliothek ein z.B.
// #include <string>

using namespace std;	// Erspart den scope vor Objekte der
						// C++-Standard-Bibliothek zu schreiben
						// z.B. statt "std::cout" kann man "cout" schreiben

// Inkludieren Sie hier die Header-Files Ihrer Klassen, z.B.
// #include "CFraction.h"
#include "CPoint.h"
#include "CRectangle.h"
#include "CScreen.h"


// Hauptprogramm
// Dient als Testrahmen, von hier aus werden die Klassen aufgerufen
int main() {
    CRectangle a(CPoint(5, 5), CPoint(25, 15)), b(CPoint(1, 2), CPoint(3, 4));
    if(a ==b)
        cout << "Rechtecke gleich" << endl;
    else
        cout << "Rechtecke verschieden" << endl;
    return 0;

    CScreen a.draw();

}



In unserem Fall heisst es ja nicht rect1 sondern a

oder?
Also a.draw?
Oder wie genau ?


Schwere Geburt aber geschafft
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
void CRectangle::draw(CScreen& screen) const
{
    for(int j = m_bottomLeft.getX(); m_topRight.getX()>=j;j++){

	for(int i = m_bottomLeft.getY();  m_topRight.getY()>=i; i++) {
	    screen.setPoint(CPoint(j , i),m_fillChar);




	}
    }
}

Auf diesen Beitrag antworten »
as_string

Ja, a.draw(...) ist im Prinzip richtig. Allerdings hat die Methode ja ein Argument vom Typ CScreen. Ich kenne diese CScreen Klasse leider nicht, deshalb weiß ich nicht, was man da machen muss. Vielleicht genügt es a.draw(CScreen()) zu schreiben? Hast Du dazu noch mehr Unterlagen? Oder die Klasse selbst wenigstens?
Auf diesen Beitrag antworten »
as_string

Ich hab gerade noch mal das Aufgabenblatt angesehen. Da steht ja alles soweit beschrieben. Du musst erst ein neues Objekt vom Typ CScreen anlegen. Dann rufst Du die draw auf, der Du das neue CScreen-Objekt übergibst. Danach musst Du noch die print() Methode des CScreen Objekts aufrufen, damit es auch ausgegeben wird.
Auf diesen Beitrag antworten »
Victor

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:

* CScreen.h
 *
 *  Created on: 05.01.2015
 *      Author: mnl
 */

#ifndef ASCIISCREENSOLUTION_MYCODE_CSCREEN_H_
#define ASCIISCREENSOLUTION_MYCODE_CSCREEN_H_

#include "CPoint.h"

/**
 * Dies Klasse repräsentiert einen Bereich von 80x24 "Punkten",
 * die als ein beliebiges Zeichen dargestellt werden können.
 */
class CScreen
{
private:
	/** Der Speicher für die Darstellung der Punkte. */
	char m_content[24*80];

public:
	/**
	 * Erzeugt eine neue Darstellung, bei der alle Punkte
	 * auf den Wert '.' gesetzt sind.
	 */
	CScreen();

	/**
	 * Setzt den angegebenen Punkt auf das angegebene Zeichen.
	 */
	void setPoint(CPoint point, char content);

	/**
	 * Gibt die Darstellung aus.
	 */
	void print() const;

	/**
	 * Löscht die Darstellung. Alle Zeichen werden wieder auf
	 * '.' gesetzt.
	 */
	void clear();
};

#endif /* ASCIISCREENSOLUTION_MYCODE_CSCREEN_H_ */




code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:

/*
 * CScreen.cpp
 *
 *  Created on: 05.01.2015
 *      Author: mnl
 */

#include <iostream>
using namespace std;

#include "CScreen.h"

CScreen::CScreen()
{
	clear();
}

void CScreen::setPoint(CPoint point, char content)
{
	if (point.getX() < 0 || point.getY() < 0
			|| point.getY() * 80 + point.getX() >= 24*80) {
		return;
	}
	m_content[point.getY() * 80 + point.getX()] = content;
}

void CScreen::print() const
{
	cout << "    ";
	for (int col = 0; col < 80; col++) {
		cout << col / 10;
	}
	cout << endl;
	cout << "    ";
	for (int col = 0; col < 80; col++) {
		cout << col % 10;
	}
	cout << endl;
	for (int row = 23; row >= 0; row--) {
		if (row < 10) {
			cout << ' ';
		}
		cout << row << ": ";
		for (int col = 0; col < 80; col++) {
			cout << m_content[row * 80 + col];
		}
		cout << endl;
	}
	cout << endl;
}

void CScreen::clear() {
	for (int i = 0; i < 24*80; i++) {
		m_content[i] = '.';
	}
}









Zeigt bei der main Probleme an ,dein beschriebenes Problem

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:

// Header-Dateien
#include <iostream>		// Header für die Standard-IO-Objekte (z.B. cout, cin)
#include <stdlib.h>
// TODO: Fügen Sie hier weitere benötigte Header-Dateien der
// Standard-Bibliothek ein z.B.
// #include <string>

using namespace std;	// Erspart den scope vor Objekte der
						// C++-Standard-Bibliothek zu schreiben
						// z.B. statt "std::cout" kann man "cout" schreiben

// Inkludieren Sie hier die Header-Files Ihrer Klassen, z.B.
// #include "CFraction.h"
#include "CPoint.h"
#include "CRectangle.h"
#include "CScreen.h"


// Hauptprogramm
// Dient als Testrahmen, von hier aus werden die Klassen aufgerufen
int main() {
    CRectangle a(CPoint(5, 5), CPoint(25, 15)), b(CPoint(1, 2), CPoint(3, 4));
    if(a ==b)
        cout << "Rechtecke gleich" << endl;
    else
        cout << "Rechtecke verschieden" << endl;
    return 0;

    CScreen rect1;
  rect1.draw();

}


Auf diesen Beitrag antworten »
as_string

Warum nennst Du das CScreen-Objekt "rect1"? Dafür aber die CRectangle-Objekte a und b? Kein Wunder, dass Du immer so verwirrt bist... Wenn es auch technisch keine große Rolle spielen mag, wie die Variablen benannt werden, ist es doch für Menschen, die das lesen irgendwie verwirrend, finde ich.
Ganz am Ende in der main musst Du noch die draw() Methode Deines CScreen-Objekts aufrufen (das, was jetzt rect1 heißt).

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

rect1.draw();

Ich dachte damit rufe ich es aus ?
Auf diesen Beitrag antworten »
as_string

Ach, nee, nicht draw()... diese print() Methode wars. Ich hatte das aber auch schon oben mal geschrieben.
Auf diesen Beitrag antworten »
Victor

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:

// Header-Dateien
#include <iostream>		// Header für die Standard-IO-Objekte (z.B. cout, cin)
#include <stdlib.h>
// TODO: Fügen Sie hier weitere benötigte Header-Dateien der
// Standard-Bibliothek ein z.B.
// #include <string>

using namespace std;	// Erspart den scope vor Objekte der
						// C++-Standard-Bibliothek zu schreiben
						// z.B. statt "std::cout" kann man "cout" schreiben

// Inkludieren Sie hier die Header-Files Ihrer Klassen, z.B.
// #include "CFraction.h"
#include "CPoint.h"
#include "CRectangle.h"
#include "CScreen.h"


// Hauptprogramm
// Dient als Testrahmen, von hier aus werden die Klassen aufgerufen
int main() {
    CRectangle a(CPoint(5, 5), CPoint(25, 15)), b(CPoint(1, 2), CPoint(3, 4));
    if(a ==b)
        cout << "Rechtecke gleich" << endl;
    else
        cout << "Rechtecke verschieden" << endl;
    return 0;

    CScreen rect1;
  rect1.draw();
  rect1.print();

}



Immer noch Fehler ?
Description Resource Path Location Type
'class CScreen' has no member named 'draw' main.cpp /CRectangle line 30 C/C++ Problem
Method 'draw' could not be resolved main.cpp /CRectangle line 30 Semantic Error

Ich meine in der Aufgabenstellung steht ja ,dass ich die print Methode aufrufen soll,aber warum ?
Das verstehe ich nicht großes Grinsen
Auf diesen Beitrag antworten »
as_string

Erstens: Bitte nenne den CSCREEN nicht rect1. Deine Rechtecke sind doch a und b!
Zweitens: draw() ist eine Methode der Klasse CRectangle und nicht CScreen! Sie hat ein Argument vom Typ SCreen, aber ist trotzdem Teil der Rechteckklasse.

Ich hab immer noch den Eindruck, dass Du überhaupt nicht verstehst, was da gemacht wird und warum. Dann frage doch bitte entsprechend nach und probieren nicht alles mögliche aus, bis ich irgendwann sage: "so stimmts"!

Gruß
Marco
Auf diesen Beitrag antworten »
as_string

Warum Du die print() Methode aufrufen sollst:
Das ist in der Aufgabe eigentlich auch beschrieben: die CSreen Klasse merkt sich in einem großen Array die Character für eine Konsolen-Seite mit 80 Zeichen Breite und 24 Zeilen (früher hatten Computer oft Bildschirme, die nur Zeichen anzeigen konnten und 80 Spalten und 25 Zeilen hatten. Vermutlich kommt die Aufgabe aus dieser Zeit...)
Allerdings merkt sich die Klasse zuerst alle Zeichen in diesem Array, ohne irgendetwas auf dem Bildschirm auszugeben, so lange nur setPoint() aufgerufen wird.
Erst der Aufruf von print() gibt die 24 Zeilen mit jeweils 80 Zeichen auf dem Bildschirm aus.

Du bereitest also mit setPoint() Aufrufen eine Bildschirmseite vor. Erst wenn alles fertig ist (z. B. alle Rechtecke gezeichnet sind), wird diese vorbereitete Bildschirmseite ausgegeben. Diesen Schritt macht print().

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

Meinst du dass ich es jetzt so machen soll oder wie ?

0;

CRectangle rect1;
rect1.draw();
rect1.print();
Auf diesen Beitrag antworten »
as_string

Nein. Schau doch einfach mal, welche Methode in welcher Klasse ist und welche Argumente die erwarten!
code:
1:
2:
3:
4:
5:
6:
CRectangle rect1(CPoint(4, 2), CPoint(26,10), 'x');
CScreen screen;
rect1.draw(screen);
screen.print();


Du verstehst überhaupt gar keinen Zusammenhang, oder? Ich weiß wirklich nicht, was ich Dir noch schreiben soll. Sag mir doch, wo Du hängst!

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

CScreen screen;
rect1.draw(screen);

Warum fügst du hier die Variable screen rein ?

Peile ich nicht großes Grinsen
Auf diesen Beitrag antworten »
as_string

Das ist es halt, was ich mit "fehlenden Grundlagen" meine. Ich finde es zwar einerseits gut, dass Du endlich mal eine solche Frage stellst und nicht nur blind rumprobierst, aber sie zeigt halt deutlich, dass die Probleme schon sehr viel tiefer anfangen und man zuerst solche Dinge mal klären muss. Das ist aber an sich nicht schlimm, nur wenn man es nie erfragt und mit Trial-and-Error versucht weiter zu kommen, dann werden sich solche Fragen auch kaum jemals klären lassen.

Die Definition der Methode draw sah ja so aus:
code:
1:
void CRectangle::draw(CScreen& screen) const {...}

Was bedeuten die einzelnen Angaben hier? Lass uns die einfach mal durch gehen.
Es fängt an mit "void". Das ist der Typ des Rückgabewerts. "void" ist aber gar kein echter Typ sondern steht für "nichts", sprich die Funktion hat keine Rückgabe. Das bedeutet aber auch, dass sie kein "return ...;" am Ende haben muss, was ja sonst dastehen muss, um etwas zurück geben zu können.
Als nächstes kommt die CRectangle::draw. Das sagt, dass wir hier die Funktion namens draw der Klasse CRectangle definieren wollen (also ausprogrammieren wollen), die aber innerhalb der Klasse, also in der Header-Datei, schon deklariert worden sein musste (schau Dir die Header-Datei an, da steht die draw auch schon drin).
Dann kommt eine Klammer und in der Klammer eine Argumentenliste. Hier besteht die Liste aus nur einem Element, nämlich einer Referenz auf das CScreen-Objekt namens screen. Das Kaufmanns-und hinter CScreen steht für "Referenz von" dem was vornedran steht, also Referenz auf ein CScreen.
Für was ist das mit den Refernezen gut? Suche mal im Internet nach "call-by-reference" im Unterschied zu "call-by-value". Kurz gesagt: Wir wollen das screen-Objekt verändern und deshalb brauchen wir eine Referenz auf das Objekt des Aufrufers und nicht eine Kopie davon, die uns ein call-by-value geben würde.
Ganz am Ende steht dann noch ein "const". Das bedeutet nur, dass die Methode selbst am CRectangle-Objekt nichts verändert. So würde man einen Fehler bekommen, wenn es die Funktion doch versuchen würde. Ändern bedeutet dann hier, dass eine Memebervariable des CRectangle-Objekts, für das die Methode aufgerufen wird, verändert werden würde.

Sprich: Hier ist die Signatur der draw-Methode schon so, dass sie in ihrer Argumentenliste ein CScreen-Objet erwartet. Deshalb muss sie auch so aufgerufen werden.
Aber was Du mitlerweile eigentlich schon verstanden haben solltest ist, warum die draw-Methode ein CScreen braucht, um etwas tun zu können. Wenn Du das immer noch nicht verstanden hast, dann frage ich mich, für was wir die letzten ~5 Seiten in diesem Thread überhaupt gemacht haben.
Die Aufgabe der draw-Methode ist doch, das Rechteck für das diese Methode aufgerufen wird, auf einen Bildschirm zu "zeichnen". Dazu verwendet sie die Methode setPoint des übergebenen CScreen-Objekts. Die Frage, warum es das übergeben bekommt, wenn alles was sie tut letztlich ist, die setPoint von einem solchen Objekt mehrfach aufzurufen, erscheint mir deshalb ziemlich merkwürdig. Kannst Du mir genau sagen, warum Dich das überrascht (hat) und warum Du gedacht hättest, das könnte auch ohne die Übergabe funktionieren?

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

Ist mein Konstruktor richtig implementiert?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
#include "CDrawing.h"

CDrawing::CDrawing(int initialSize)
{
    if(initialSize>0 && initialSize <=0){
        
        m_initialSize = initialSize;
    }
    else{
        m_initialSize = 10;
    }
    if(m_nextFree>=0 && m_nextFree<=m_arraySize){
        
        m_nextFree= nextFree;
    }
    else{
        
        m_nextFree=0;
    }
    if(m_arraySize>0){
        m_arraySize= arraySize;
    }
}

CDrawing::~CDrawing()
{
    //dtor
}






code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:

#ifndef CDRAWING_H
#define CDRAWING_H


class CDrawing
{
private:
    CRectangle* m_rectangles;
    int m_nextFree = 0;
    int m_arraySize;

public:
    CDrawing(int initialSize = 10);
    void ~CDrawing();
    void add(const CRectangle& rectangle);
    void print();
    void drawFiltered(CScreen& screen, char filter =0);

};

#endif // CDRAWING_H


Ich weiss das das iostream usw fehlt ,aber stimmt der code soweit?
Auf diesen Beitrag antworten »
Victor

Ne idee String?
Auf diesen Beitrag antworten »
as_string

Schon, aber es macht halt alles wieder wenig Sinn...
Es steht etwas von einem Array in der Aufgabe, in dem die Rechtecke gespeichert werden sollen und das Du im Konstruktor anlegen und im Destruktor freigeben sollst. Davon zb erkenne ich gar nichts.

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

Hi String ,bin froh dass du wieder zurück bist großes Grinsen

Habe mal Speicher allokiert und wieder bei Destruktor freigegeben .

Passt es so ?
Sind die Zusicherungen vom Konstruktor richtig?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:

#include "CDrawing.h"
#include <ostream>
using namespace std;
CDrawing::CDrawing(int initialSize)
{
    if(initialSize>0 && initialSize <=10){

        m_initialSize = initialSize;
    }
    else{
        m_initialSize = 10;
    }
    if(0<= m_nextFree <= m_arraySize){

        m_nextFree= nextFree;
    }
    else{

        m_nextFree=0;
    }
    if(m_arraySize>0){
        m_arraySize= arraySize;
    }

    CRectangle* m_rectangles = new Crectangle;
}

CDrawing::~CDrawing()
{
    delete[] m_rectangles;
}


Auf diesen Beitrag antworten »
Karlito

Das hat keinen Sinn. Ich schließe das Thema jetzt.

- Es ist nicht erkennbar, dass Du irgendetwas von dem verstehst, was Du tun sollst
- Du fragst nicht nach Verständnis
- Du probierst wild und testest offensichtlich nicht selbst
- Der ganze Thread hier führt einzig dazu, dass Du eine Lösung erhältst, ohne wesentliche Eigenleistung

Zitat:

Das Informatikerboard gibt „Hilfe zur Selbsthilfe“. Diese besteht aus Tipps und Hinweisen, so dass die Fragesteller den Stoff verstehen und die Aufgaben selbst bewältigen können.


Dies sehe ich nicht mehr als erfüllt an, da Seitens des Fragestellers keine Eigenleistung, welche über unreflektiertes Ausprobieren hinaus geht, erkennbar ist.

Besten Gruß,

Karlito
Auf diesen Beitrag antworten »
Karlito

Zitat:
Original von Victor

Passt es so ?
Sind die Zusicherungen vom Konstruktor richtig?

Nein

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:

#include "CDrawing.h"
#include <ostream>
using namespace std;
CDrawing::CDrawing(int initialSize)
{
    if(initialSize>0 && initialSize <=10){ //Warum initialSize <=10?

        m_initialSize = initialSize; //m_initialSize existiert nicht!
    }
    else{
        m_initialSize = 10; 
    }
    if(0<= m_nextFree <= m_arraySize){ // Was soll das? _m_nextfree ist immer 0 hier. Das ergibt keinen Sinn! Welchen sinn hat denn m_nextFree?

        m_nextFree= nextFree; //nextFree existiert hier nicht!
    }
    else{

        m_nextFree=0;
    }
    if(m_arraySize>0){
        m_arraySize= arraySize; //arraySize exisitert nicht!
    }

    CRectangle* m_rectangles = new Crectangle; //Das ist kein gültiges Statement
}

CDrawing::~CDrawing()
{
    delete[] m_rectangles; 
}




Formuliere doch mal bitte in eigenen Worten, welchen Sinn die Deklarationen in der Header-Datei haben und was der Konstruktor machen soll.

Gruß,

Karlito
Auf diesen Beitrag antworten »
Victor

Ehrlich gesagt verstehe ich jetzt gar nicht was ich beim Konstruktor genau machen soll?
Normalerweise ist ja im Konstruktor nur die Variable initialSize vorhanden .

Spielen in diesem Fall die anderen Zusicherungen überhaupt keine Rolle?

In der Header sind mehrere Variablen gegeben um etwas zu zeichnen ?
Auf diesen Beitrag antworten »
Karlito

Der Konstruktor initialisiert ein Objekt beim erstellen. D.h. er tut alles, was notwendig ist, damit man ein Objekt einer Klasse verwenden wann.

Dazu folgende Frage:
- Was ist der Unterschied zwischen Objekt und Klasse?

Diese "Zusicherungen" sind schon wichtig, aber:
- Was genau willst Du denn zusichern?
- Was bzweckst Du mit deinen Zusicherungen, die Du formuliert hast?

Gruß,

Karlito
Auf diesen Beitrag antworten »
Victor

Genau das ist ja meine Frage . großes Grinsen

Ich verstehe an der Aufgabe nicht genau was die von mir haben wollen .

Ich habe einfach die Zusicherungen beachtet , die ich dachte richtig zu sein großes Grinsen
Auf diesen Beitrag antworten »
Karlito

Zitat:
Original von Victor
Genau das ist ja meine Frage . großes Grinsen

Was jetzt genau? Ich habe mehrere formuliert. Und ich habe Sie formuliert, weil Du dir darüber klar werden sollst. Wenn Du das nicht wirst, probierst Du wieder nur rum und bist dir gar nicht im klaren darüber was das soll.

Zitat:
Original von Victor
Ich verstehe an der Aufgabe nicht genau was die von mir haben wollen .

Genau darin liegt das Problem und daran solltest Du als Erstes arbeiten. Du verstehst die Konzepte nicht und dafür stellst Du hier die falschen Fragen. Deine Fragen zielen immer darauf ab einen Lösungsversuch zu kontrollieren und ich unterstelle, dass Du hoffst dadurch die Lösung zu bekommen, weil der Antwortende die Geduld mit deinen Fehlversuchen verliert.

Zitat:
Original von Victor
Ich habe einfach die Zusicherungen beachtet , die ich dachte richtig zu sein großes Grinsen

Wie? Und welche Zusicherungen. Was wolltest Du wie zusichern und vor allem warum?

Besten Gruß,

Karlito
Auf diesen Beitrag antworten »
Victor

Im Uml Diagramm , dass ich angehängt hatte waren Zusicherungen gegeben .

Dachte die gehören zum Konstruktor ?
Auf diesen Beitrag antworten »
Karlito

Welche?
Auf diesen Beitrag antworten »
Victor

Blätter bitte 2 oder 1 Seite zurück .
Da ist ein Bild angehängt großes Grinsen
Auf diesen Beitrag antworten »
Karlito

Nein! Ich habe die Aufgabenstellung verstanden. Ich möchte sehen, dass Du sie auch verstanden hast!
Auf diesen Beitrag antworten »
Victor

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
#include "CDrawing.h"
#include <ostream>
using namespace std;
CDrawing::CDrawing(int initialSize)
{
    if(initialSize>0 && initialSize <=10){

        m_initialSize = initialSize;
    }
    else{
        m_initialSize = 10;
    }
    if(0<= m_nextFree <= m_arraySize){

        m_nextFree= nextFree;
    }
    else{

        m_nextFree=0;
    }
    if(m_arraySize>0 && m_arraySize <=10){
        m_arraySize= initialSize;
    }
    m_arraySize = initialSize;
   m_rectangles = new CRectangle[m_arraySize] ;
}


CDrawing::~CDrawing()
{
    delete m_rectangles;
}




Ich glaube der Speicher ist richtig allokiert,aber beim Konstruktor bin ich immer noch nicht sicher ?
Auf diesen Beitrag antworten »
Karlito

Die Allokierung sieht gut aus. Über was bist Du dir nicht sicher? Was willst Du denn machen? Und was hast Du versucht zu tun und warum? Und woran zweifelst Du?

Besten Gruß,

Karlito
Auf diesen Beitrag antworten »
Victor

Reicht das so aus?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
l

CDrawing::CDrawing(int initialSize) 
{ 
    m_arraySize = initialSize; 
    m_rectangles = new CRectangle[initialSize]; 
}

Auf diesen Beitrag antworten »
as_string

Zitat:
Original von Victor
Reicht das so aus?

Du gehst nie auf das ein, was Dir die Leute sagen bzw antwortest, auf was sie Dich fragen.Beantworte endlich mal Kalitos Fragen! Mit eigenen Worten und erstmal ohne neuen Quelltext.

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

Zitat:
Original von Victor
Genau das ist ja meine Frage . großes Grinsen

Ich verstehe an der Aufgabe nicht genau was die von mir haben wollen .

Ich habe einfach die Zusicherungen beachtet , die ich dachte richtig zu sein großes Grinsen



Hatte ich ja bereits hier schon gesagt
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »