C ++类方法调用.cpp而不用::

时间:2016-09-21 21:32:04

标签: c++

我是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部分。

谢谢

3 个答案:

答案 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) {}
  // ...
};