所以我习惯了Java,但我学习的是C ++,对我来说最重要的是我喜欢为很多东西创建单独的类。并将这些类保存在他们自己的单独文件中,就像Java一样。但在java中我会通过说Class.method(arguments)来访问另一个类;我怎么用C ++做到这一点?
这是具体的代码
的main.cpp
int main(int argc, char** argv) {
Vector2f a = new Vector2f(2.0f, 4.0f);
std::cout << "Magnitude :" << mod(a);
return 0;
}
这是类文件
class Vector2f{
private:
float _x;
float _y;
public:
//Constructor
void Vector2f(float x, float y){
_x = x;
_y = y;
}
//Vector Operations
float dot(Vector2f a, Vector2f b){
return (a.getX()*b.getX()) + (a.getY()*b.getY());
}
float mod(Vector2f a){
return sqrt((a.getX()*a.getX())+(a.getY()*a.getY()));
}
//Getters and Setters
void setX(float x){
_x = x;
}
void setY(float y){
_y = y;
}
float getX(){
return _x;
}
float getY(){
return _y;
}
};
为什么这不起作用?应该只创建一个vector类的实例??
答案 0 :(得分:0)
首先,请注意您正在定义所有内联方法,您可能已经或可能没有这些方法。
其次,如果您想从Vector2f
访问main.cpp
,则必须#include
定义该类的头文件。
如果没有这个#include
,编译器会看到类和方法声明,所以会抱怨你试图实例化一个它不知道的类。
第三,您正在使用new
,它返回一个指针,因此您需要将变量声明为指针类型。
Vector2f* a = new Vector2f(2.0f, 4.0f);
此外,如果使用new
在堆上创建对象,则在完成使用后应delete
。
delete a;
或者,如果要在堆栈(而不是堆)上实例化,则可以按照其他答案的建议进行实例化。
Vector2f a(2.0f, 4.0f);
第四,你的类中有很多编译错误,在尝试实例化对象之前你可能想要修复它。例如,即使在Java中,构造函数也不会返回void 。
答案 1 :(得分:0)
首先,您不需要在构造函数前面void
。您的构造函数可以像这样构造:
Vector2f(float x, float y){
_x = x;
_y = y;
}
对于课堂内的功能,您不必为其创建另一个参数。所以你的功能可能是:
float dot(Vector2f b){
return (getX()*b.getX()) + (getY()*b.getY());
}
float mod(){
return sqrt((getX()*getX()) + (getY()*getY()));
}
与其他功能相同。
访问类中的函数。你这样做:className.functionName();
您不必使用关键字new
来创建新实例。 new
的作用是在堆内创建对象,如果使用new
创建对象,则必须在完成后使用delete
。否则,它将导致泄漏记忆。主要的,你可以这样做:
int main()
{
Vector2f a(2.0f, 4.0f);
std::cout << "Magnitude :" << a.mod() << std::endl;
return 0;
}