Rechteck Klasse



  • Guten Mittag,
    muss für die uni gerade ne klasse rechteck schreiben, hier der code:

    //---------------------------------------------------------------------------
    #ifndef RECTANGLE_H
    #define RECTANGLE_H
    #include <vcl.h>
    #pragma hdrstop
    #include <iostream>
    #include <tchar.h>
    //---------------------------------------------------------------------------
    
    #pragma argsused
    using namespace std;
    
    class Rectangle {
    	private:
    		int width;
    		int height;
    	public:
    		Rectangle(int = 0, int = 0);
    		void print() const;
    };
    
    #endif
    
    void Rectangle::print() const
    {
    	for (int i = 0; i < height; i++) {
    		for (int j = 0; j < width; j++) {
    			if (i == 0 || i == height-1) {
    				cout << "x ";
    			}
    			else {
    				if (j == 0 || j == width-1) {
    					cout << "x";
    				}
    				else {
    					cout << " ";
    				}
    			}
    		}
    		endl(cout);
    	}
    }
    
    Rectangle::Rectangle(int w, int h)
    {
    	width = w;
    	height = h;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Rectangle r1(5,3);
    	r1.print();
    	Rectangle r2(15,5);
    	r2.print();
    	cin.get();
    	return 0;
    }
    

    aber irgendwie will der bei mir das rechteck in der main nicht erzeugen einzige was der erlaubt ist "Rectangle;" und das is ja mal totaler unsinn.... kann jemand da mal eben drüber gucken und mir sagen wo das problem liegt??

    vielen dank



  • Also erstmal: Wozu diese ganzen sinnlosen includes? Du brauchst nur <iostream>, mehr nicht.
    Genauso ist "int _tmain(int argc, _TCHAR* argv[])" in deinem Fall überhaupt nicht nötigt, ein "int main()" tut's auch.

    aber irgendwie will der bei mir das rechteck in der main nicht erzeugen einzige was der erlaubt ist "Rectangle;"

    Also bei mir klappt dein Code (zumindest nachdem ich die nicht verwendeten/bei mir nicht verfügbaren Header rausgeschmissen habe). Die Rechtecke werden zwar nicht richtig angezeigt, aber es wird ohne Probleme kompiliert.

    Hast du ggf. versucht so etwas zu machen:

    int main()
    {
      Rectangle r1();
      /*...*/
    }
    

    Wenn ja, dann handelt es sich hierbei um die Deklaration einer Funktion mit dem Namen r1, die keine Argumente erwartet und ein Rectangle als Rückgabewert hat.
    Richtig wäre hier: Rectangle r1;

    Wenn das nicht das Problem ist, müsstest du dich vielleicht nochmal genauer ausdrücken.



  • danke schonmal für die hilfe, werds gleich ausprobieren....
    die includes etc. kommen daher das ich im c++ builder schreibe und der den quatsch automatisch in ne leere cpp datei reinhaut und ich mir gedacht hab, wenn das programm die vorgibt, können die ja auch nich schaden



  • egal was ich mache der compiler gibt immer die fehlermeldung raus das er hinter Rectangle ein simicolon erwartet...
    ich kann auch alle includes rausschmeißen das scheint nix zu ändern außer #include <vcl.h> die braucht der c-builder scheinbar zum compilieren



  • D.h. folgender Code kompiliert bei dir nicht?

    //---------------------------------------------------------------------------
    #ifndef RECTANGLE_H
    #define RECTANGLE_H
    #include <iostream>
    #include <vcl.h>
    //---------------------------------------------------------------------------
    
    using namespace std;
    
    class Rectangle {
        private:
            int width;
            int height;
        public:
            Rectangle(int w = 0, int h = 0);
            void print() const;
    };
    
    #endif
    
    void Rectangle::print() const
    {
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                if (i == 0 || i == height-1) {
                    cout << "x ";
                }
                else {
                    if (j == 0 || j == width-1) {
                        cout << "x";
                    }
                    else {
                        cout << " ";
                    }
                }
            }
            cout << endl;
        }
    }
    
    Rectangle::Rectangle(int w, int h)
    {
        width = w;
        height = h;
    }
    
    int main()
    {
        Rectangle r1(5, 3);
        r1.print();
        cin.get();
    }
    


  • nein irgendwie nicht, krieg folgende Fehlermeldung:

    [BCC32 Fehler] Opdracht-9.1.cpp(49): E2379 In Anweisung fehlt ;
    Vollständiger Parser-Kontext
    Opdracht-9.1.cpp(48): Analyse: int main()
    [BCC32 Fehler] Opdracht-9.1.cpp(50): E2451 Undefiniertes Symbol 'r1'
    Vollständiger Parser-Kontext
    Opdracht-9.1.cpp(48): Analyse: int main()



  • Das Listing ist meinem ästhetischen Verständnis nach etwas gruselig. Ich habe hier mal eine sinnvolle Einteilung der Header- und Quelldateien gewählt sowie einige Kleinigkeiten im Programm geändert (Stichwort: std::string), vorgenommen. Was die VLC-Header angeht, kann ich nichts sinnvolles beisteuern, da ich den VLC nicht nutze.

    main.cc

    #include "rectangle.h"
    
    int main()
        {
            Rectangle r(16, 10);
            r.print();
        }
    

    rectangle.h

    #if !defined(CPPDE_RECTANGLE_H__INCLUDED)
    #define CPPDE_RECTANGLE_H__INCLUDED
    
    class Rectangle
    {
    public:
        // +++ Interface +++
        Rectangle(unsigned int width=0, unsigned int height=0);
            // Default-Constructor
    
        void print() const;
            // Prints the rectangle onto the console (std::cout)
    
        // +++ Non-Interface +++
    private:
        unsigned int width_;
        unsigned int height_;
    
    };
    
    #endif
    

    rectangle.cc

    #include "rectangle.h"
    #include <string>
    #include <iostream>
    
    using std::cout;
    using std::string;
    using std::endl;
    
    Rectangle::Rectangle(unsigned int width, unsigned int height)
        : width_(width), height_(height)
        { }
    
    void Rectangle::print() const
        {
            // Rectangle with either width or height equal zero will not be
            //  displayed
            if(width_ == 0u || height_ == 0u) return;
    
            for(unsigned int n = 0u; n < height_; ++n) {
                // If 1st and last line print out a "filled" line. Else print out
                //  only left and right side (imitate borders)
                if(n == 0 || n == height_ - 1) {
                    cout << string(width_, '+') << endl;
                }
                else {
                    cout << '+' << string(width_ - 2, ' ') << '+' << endl;
                }
            }
        }
    

    Darüber hinaus kann ich nur empfehlen, alle Projekte mit den Compiler-Optionen -Wall und -pedantic zu übersetzen. Des weiteren niemals(!) using in Header-Dateien.

    ➡ http://www.cppreference.com/wiki/string/string_constructors

    Grüße ...
    Heiko



  • mh.....

    hab einfach nen neues projekt gemacht diesmal einfach von anfang an ohne vcl einstellung und einfach nur alles rüberkopiert und jetzt funktionierts....
    danke für eure hilfe


Anmelden zum Antworten