我是C ++程序员的新手。我有很好的Java背景,但C ++在很多方面都有所不同,我对其中一个关于.h和.cpp的文件有疑问。
对于具有x和y位置的点对象,我有以下文件:
Point.h
#ifndef POINT_H_
#define POINT_H_
class Point{
Point();
Point(int newX, int newY);
public:
int getX();
int getY();
void setX(int newX);
void setY(int newY);
void moveBy(int moveX, int moveY);
Point reverse();
private:
int x;
int y;
};
#endif
Point.cpp
#include "Point.h"
using namespace Point;
Point::Point(int newX, int newY){
x = newX;
y = newY;
}
int Point::getX(){
return x;
}
int Point::getY(){
return y;
}
void Point::setX(int newX){
x = newX;
}
void Point::setY(int newY){
y = newY;
}
void Point::moveBy(int moveX, int moveY){
x += moveX;
y += moveY;
}
Point Point::reverse(){
return Point(y,x);
}
我想知道是否有一种方法可以通过使用命名空间来避免使用std :: cout这样的Point::Point
部分。
谢谢
答案 0 :(得分:1)
您不需要 来分隔您的声明和定义,这些功能非常简单。因此,将它们包含在类定义中实际上可以允许编译器执行许多其他优化。
所以你可以完全丢弃.cpp,标题变为:
#ifndef POINT_H_
#define POINT_H_
class Point
{
int x_ { 0 };
int y_ { 0 };
public:
Point() = default;
Point(int x, int y) : x_(x), y_(y) {}
int getX() const { return x_; }
int getY() const { return y_; }
void setX(int x) { x_ = x; }
void setY(int y) { y_ = y; }
void moveBy(int x, int y) { x_ += x, y_ += y; }
Point reverse() const { return Point(y_, x_); }
};
#endif
但你不能避免使用" Point ::"在定义类声明之外的成员时的一部分。
答案 1 :(得分:1)
如果您不想在Point::
,getX
等前面输入“getY
”,那么答案是“no”,不幸。在C ++中,任何类的名称(如“Point
”)都不是名称空间,它是范围。
你只能做内联方法,定义为类声明。
class Point {
public:
void a_method() {
// all the code here!
}
};
答案 2 :(得分:0)
除非在类声明中声明构造内联,否则无法避免“Point::Point
部分”。第一个“Point”定义函数的范围,第二个“Point”是构造函数的名称。
但是,您可以内联定义构造函数,如下所示:
class Point
{
Point()
{
x = 0;
y = 0;
}
Point(int newX, int newY);
{
x = newX;
y = newY;
}
// ...
};
或者:
class Point
{
Point() : x(0), y(0) {}
Point(int newX, int newY) : x(newX), y(newY) {}
// ...
};
或者:
class Point
{
Point(int newX = 0, int newY = 0) : x(newX), y(newY) {}
// ...
};