2017-07-18 5 views
2

Ich bin neu mit C++ und ich bin derzeit für Prüfungen, C++ in VisualStudio und Experimentieren ein wenig zu studieren. Normalerweise arbeite ich mit Java.Klassenmitglied Funktionen für C++ Neuling

schrieb ich eine einfache Klasse, um zu sehen, ob und wie die Dinge funktionieren:

class Point 
{ 
private: 
    int x; 
    int y; 

public: 
    Point(int arg1, int arg2) 
    { 
     x = arg1; 
     y = arg2; 
    } 
}; 

ich für x und y 2 einfache Mitgliederfunktionen hätte gerade versucht, in x- und y-Variablen gespeichert, um den Wert zu verdoppeln.

Zuerst habe ich versucht, dies:

void doubleX() 
{ 
    x *= 2; 
}; 

void doubleY() 
{ 
    y *= 2; 
}; 

Dann ist dieses Ich habe versucht:

void doubleX() 
{ 
    Point::x = 2 * Point::x; 
}; 

void doubleY() 
{ 
    Point::y = 2 * Point2::y; 
}; 

Beide innerhalb die Klassendefinition gesetzt werden.

Während durch Visual Studio Gebäude es alwas gibt mir diese Fehlerwarnung: „Fehler C3867‚Punkt :: Doublex‘: Nicht-Standard-Syntax, Verwendung‚&‘einen Zeiger auf ein Element erstellen“

mess Versuchte auch mit Adress-Zeigern, aber ... ich habe wirklich keine Ahnung. Ich denke, ich weiß, wie Zeiger grundsätzlich funktionieren, aber ich habe keine Ahnung, wie man es für meinen Fall hier verwendet.

Eine schnelle Lösung und Erklärung für dieses Problem?

Vielen Dank im Voraus!

EDIT: hier ist mein ganzer Code ist Problem in der Haupt jetzt

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

using namespace std; 

class Point 
{ 
public: 
    int x; 
    int y; 

    Point(int arg1, int arg2) 
    { 
     x = arg1; 
     y = arg2; 
    } 

    void doubleX() 
    { 
     x *= 2; 
    }; 

    void doubleY() 
    { 
     y *= 2; 
    }; 
}; 

int main() 
{ 
    Point p(1,1); 

    int &x = p.x; 
    int &y = p.y; 

    cout << x << "|" << y; 

    p.doubleX; p.doubleY; //error message here 

    cout << x << "|" << y; 

    cin.get(); 
} 
+2

Was ist 'Point2'? Um auf Klassenmitglieder zu verweisen, würden Sie 'this->' verwenden oder einfach weglassen (genau wie in Java) – UnholySheep

+1

Sie müssen Ihre Mitgliedsfunktionen _inside_ die Klassendefinition deklarieren - von dem, was Sie eingefügt haben, ist es überhaupt nicht klar du hast das getan. – Useless

+0

Sie können diesen Fehler möglicherweise nicht von diesem Code erhalten. Sie sollten [hier] starten (https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – molbdnilo

Antwort

4

Vielleicht haben Sie nicht die Member-Funktionen in die Klassendefinition deklariert? Hier ist ein voll funktionierendes Beispiel auf der Grundlage Ihrer Klasse:

#include <iostream> 


class Point 
{ 
private: 
    int x; 
    int y; 

public: 
    Point(int arg1, int arg2) 
    { 
     x = arg1; 
     y = arg2; 
    } 

    void doubleX() 
    { 
     x *= 2; /* or this->x *= 2; */ 
    } 

    void doubleY() 
    { 
     y *= 2; 
    } 

    int getX() 
    { 
     return x; 
    } 

    int getY() 
    { 
     return y; 
    } 
}; 


int main() 
{ 
    Point p(2, 3); 

    std::cout << "p.x = " << p.getX() << " | p.y = " << p.getY() << std::endl; 

    p.doubleX(); 
    p.doubleY(); 

    std::cout << "p.x = " << p.getX() << " | p.y = " << p.getY() << std::endl; 

    return 0; 
} 

Sie dies in einer main.cpp Datei setzen, kompilieren und ausführen. Ich habe es mit dem g++ Compiler getestet und es funktioniert gut.

+0

Oh, jetzt sehe ich, dass das eigentliche Problem in meiner Hauptmethode war, sorry Jungs, sollte den ganzen Code gepostet haben. – GenerationLost

+0

'int main() { \t Punkt p (1,1); \t cout << p.x << "|" << p.y; \t p.doubleX; p.doubleY; \t cout << p.x << "|" << p.y; \t cin.get(); } ' Das ist mein Haupt, Mitglieder sind öffentlich, also warum kann ich nicht auf sie mit" p.x "zugreifen? – GenerationLost

+0

Das ist ziemlich einfach zu erkennen :). Das Problem besteht nicht beim Zugriff auf 'p.x' und' p.y'. 'doubleX' und' doubleY' sind ** Funktionen **! Also müssen Sie sie wie 'p.doubleX(); p.doubleY(); '. – Valy

-2

In Ihrem zweiten Satz von Funktionen

void doubleX() 
{ 
    Point2::x = 2 * Point2::x; 
}; 

void doubleY() 
{ 
    Point2::y = 2 * Point2::y; 
}; 

Wenn Sie ihnen Elementfunktionen der Klasse Punktes sein wollen, Point::y ... so sollten Sie nicht auf die Mitgliedsdaten zugreifen. Nur statische Membervariablen können so aufgerufen werden. Der richtige Weg ist

void doubleX() 
{ 
    this->x = 2 * this->x; 
}; 

void doubleY() 
{ 
    this->y = 2 * this->y; 
}; 

Das this Zeiger verwendet.

1

Kann nicht aufgrund Ruf kommentieren, aber es scheint, vC++ die Fehlermeldung ausgibt Sie angegeben, wenn Sie

Point::doubleX 

Hier ist ein anschauliches Beispiel der Ausgabe zu nennen versuchen: http://rextester.com/ZLCEW66682

Sie sollten erstellen eine Instanz der Klasse und rufen Sie die Funktion mit Parens

+0

Dies ist, was ich tue, sorry, ich habe meinen Eintragspost bearbeitet und meine Hauptmethode hinzugefügt, in der ich 'p.doubleX; p.doubleY' – GenerationLost

+0

Sie sollten die Funktionen p.doubleX() und p.doubleY() einschließlich parens –

+0

Jesus Christus, vielen Dank! Jetzt fühle ich mich wirklich dumm. Ich gehe jetzt einen Kaffee holen .......... – GenerationLost

2

Die Antwort von Valy ist richtig. Aber ich möchte Sie daran erinnern, dass C++ Ihnen eine andere Möglichkeit bietet, Methoden zu deklarieren und zu definieren, dh die Methode innerhalb der Klassendeklaration zu deklarieren und sie außerhalb der Klassendeklaration zu definieren. Dies ermöglicht es Ihnen leicht getrennt Schnittstelle und Implementierung in .h und .cpp Dateien sind, wie unten dargestellt:

Point.h

class Point 
{ 
private: 
    int x; 
    int y; 

public: 
    Point(int arg1, int arg2); 
    void doubleX(); 
    void doubleY(); 
    int getX(); 
    int getY(); 
}; 

Point.cpp

#include "Point.h" 

Point::Point(int arg1, int arg2) 
{ 
    x = arg1; 
    y = arg2; 
} 

void Point::doubleX() 
{ 
    x *= 2; 
} 

void Point::doubleY() 
{ 
    y *= 2; 
} 

int Point::getX() 
{ 
    return x; 
} 

int Point::getY() 
{ 
    return y; 
} 

// PointTest.cpp

#include "Point.h" 

int main() 
{ 
    // Do something with Point here 
    Point pt(1, 2); 

    std::cout << "Original: (" << pt.getX() << ", " << pt.getY() << ")" << std::endl; 

    pt.doubleX(); 
    pt.doubleY(); 

    std::cout << "After being doubled: (" << pt.getX() << ", " << pt.getY() << ")" << std::endl; 

    return 0; 
} 

Und, wie kompiliert:

g++ -o PointTest PointTest.cpp Point.cpp 
+0

Danke für den Hinweis!In die Header-Verwendung und Inline/Makros zu kommen, wird das nächste Thema sein, das ich durchgehen werde. – GenerationLost

+1

Ja, das ist natürlich die bessere Lösung und ich dachte darüber nach, es selbst so zu schreiben. Ich wollte ihm nur eine schnelle Lösung geben und nicht zu viele neue Konzepte einführen. – Valy

Verwandte Themen