class 面向 C++ 新手的成员函数
class member functions for C++ newbie
我是 C++ 的新手,目前正在为考试而学习,在 VisualStudio 中使用 C++ 并进行一些试验。通常我都和 Java 一起工作。
我写了一个简单的 class 来查看它如何工作以及是否工作:
class Point
{
private:
int x;
int y;
public:
Point(int arg1, int arg2)
{
x = arg1;
y = arg2;
}
};
我为 x 和 y 尝试了 2 个简单的成员函数,只是将存储在 x 和 y 变量中的值加倍。
首先我尝试了这个:
void doubleX()
{
x *= 2;
};
void doubleY()
{
y *= 2;
};
然后我试了这个:
void doubleX()
{
Point::x = 2 * Point::x;
};
void doubleY()
{
Point::y = 2 * Point2::y;
};
两者都放在 的 class 定义中。
在通过 VisualStudio 构建时,它总是给我这个错误警告:
"Error C3867 'Point::doubleX': non-standard syntax; use '&' to create a pointer to member"
我也试图弄乱地址指针,但是...我真的不知道。
我想我知道指针基本上是如何工作的,但我不知道如何在我的案例中使用它。
这个问题有什么快速的解决方法和解释吗?
提前致谢!
编辑:这是我的全部代码,现在主要是问题
#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();
}
在你的第二组函数中
void doubleX()
{
Point2::x = 2 * Point2::x;
};
void doubleY()
{
Point2::y = 2 * Point2::y;
};
如果您希望它们成为 class 点的成员函数,Point::y
...这不是您访问成员数据的方式。只能这样访问静态成员变量。正确的方法是
void doubleX()
{
this->x = 2 * this->x;
};
void doubleY()
{
this->y = 2 * this->y;
};
即使用this
指针。
也许您没有在 class 定义的 中声明成员函数 ?这是基于您的 class:
的完整工作示例
#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;
}
您可以将其放入 main.cpp
文件中,编译并 运行 它。我用 g++
编译器测试了它,它工作正常。
由于声誉原因无法发表评论,但似乎 vc++ 在您尝试调用
时会输出您陈述的错误消息
Point::doubleX
这是输出的一个实例:
http://rextester.com/ZLCEW66682
您应该创建 class 的实例并使用括号
调用该函数
Valy 给出的答案是正确的。但我想提醒您,C++ 为您提供了另一种声明和定义方法的选择,即在 class 声明内声明方法,并在 class 声明外定义它们。这使您能够轻松地将接口和实现分别分离到 .h
和 .cpp
文件中,如下所示:
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;
}
以及,如何编译:
g++ -o PointTest PointTest.cpp Point.cpp
我是 C++ 的新手,目前正在为考试而学习,在 VisualStudio 中使用 C++ 并进行一些试验。通常我都和 Java 一起工作。
我写了一个简单的 class 来查看它如何工作以及是否工作:
class Point
{
private:
int x;
int y;
public:
Point(int arg1, int arg2)
{
x = arg1;
y = arg2;
}
};
我为 x 和 y 尝试了 2 个简单的成员函数,只是将存储在 x 和 y 变量中的值加倍。
首先我尝试了这个:
void doubleX()
{
x *= 2;
};
void doubleY()
{
y *= 2;
};
然后我试了这个:
void doubleX()
{
Point::x = 2 * Point::x;
};
void doubleY()
{
Point::y = 2 * Point2::y;
};
两者都放在 的 class 定义中。
在通过 VisualStudio 构建时,它总是给我这个错误警告: "Error C3867 'Point::doubleX': non-standard syntax; use '&' to create a pointer to member"
我也试图弄乱地址指针,但是...我真的不知道。 我想我知道指针基本上是如何工作的,但我不知道如何在我的案例中使用它。
这个问题有什么快速的解决方法和解释吗?
提前致谢!
编辑:这是我的全部代码,现在主要是问题
#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();
}
在你的第二组函数中
void doubleX()
{
Point2::x = 2 * Point2::x;
};
void doubleY()
{
Point2::y = 2 * Point2::y;
};
如果您希望它们成为 class 点的成员函数,Point::y
...这不是您访问成员数据的方式。只能这样访问静态成员变量。正确的方法是
void doubleX()
{
this->x = 2 * this->x;
};
void doubleY()
{
this->y = 2 * this->y;
};
即使用this
指针。
也许您没有在 class 定义的 中声明成员函数 ?这是基于您的 class:
的完整工作示例#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;
}
您可以将其放入 main.cpp
文件中,编译并 运行 它。我用 g++
编译器测试了它,它工作正常。
由于声誉原因无法发表评论,但似乎 vc++ 在您尝试调用
时会输出您陈述的错误消息Point::doubleX
这是输出的一个实例: http://rextester.com/ZLCEW66682
您应该创建 class 的实例并使用括号
调用该函数Valy 给出的答案是正确的。但我想提醒您,C++ 为您提供了另一种声明和定义方法的选择,即在 class 声明内声明方法,并在 class 声明外定义它们。这使您能够轻松地将接口和实现分别分离到 .h
和 .cpp
文件中,如下所示:
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;
}
以及,如何编译:
g++ -o PointTest PointTest.cpp Point.cpp