Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 点运算符和get方法之间的差异_C++ - Fatal编程技术网

C++ 点运算符和get方法之间的差异

C++ 点运算符和get方法之间的差异,c++,C++,我有一个向量类 class Vector { public: double x, y, z; Vector add(Vector v) { return Vector(x+v.x, y+v.y, z+v.z); } }; 我有一门课,雷 class Ray { public: Vector origin, direction; Vector getOrigin() { return origin; } }; 在某种程度上,我做到了: V

我有一个向量类

class Vector {
public:
    double x, y, z;
    Vector add(Vector v) {
        return Vector(x+v.x, y+v.y, z+v.z);
    }
};
我有一门课,雷

class Ray {
public:
    Vector origin, direction;
    Vector getOrigin() { return origin; }
};
在某种程度上,我做到了:

Vector x = ray.origin().add(normal); // doesn't work
Vector y = ray.getRayOrigin().add(normal); // works
错误消息:类型向量不提供呼叫接线员


为什么我不能直接访问向量?

因为
原点
不是一个函数。访问时请删除括号。

,因为
原点
不是函数。访问时请删除括号。

Xīcò有正确的解决方案,但没有正确的症状

origin
不必是函数。
Vector
类可以重载
operator()
,并像调用函数一样进行调用,这就是编译器试图传递的消息

ray.origin
允许任何人对
ray
origin
成员执行任何操作,包括可能对
ray
有害的操作。很不酷。setter和getter的目的是规范对成员变量的访问。目标是自卫

OP的
getOrigin
方法不返回origin。它返回一个origin的副本。恶意的白痴可以在不破坏光线的情况下对副本执行任何他们想要的操作。这通常是正确的方法,除非返回的对象是要修改的或复制成本过高。在这种修改情况下,使用私有数据以及它自己的getter和setter锁定返回的对象。在昂贵复制的情况下,将返回值声明为
const
,以减少损坏的可能性

一个好的setter会在允许更改发生之前检查
成员的所有输入。如果调用者试图输入与
origin
不一致的值,
ray
可以将其关闭

通过
直接访问
origin
允许
ray
无任何防御。它还可以防止
ray
在不改变origin用户的情况下更改origin的实现


这些是否与一对简单的类有关,如
Vector
Ray
,这是一个编码风格和必要性的问题,但将数据访问锁定到最低限度通常是一个好习惯,也是开发复杂软件时的一个必要条件。

class Vector {
  public:
    double x, y, z;
    Vector add(Vector v) {
      return Vector(x+v.x, y+v.y, z+v.z);
    }
};

class Ray {
  public:
    Vector origin, direction;
    Vector getOrigin() { return origin; }
    Vector& getOrigin2() { return origin; }
};

int main() {
    Ray ray;
    Vector v1 = ray.origin;  // returns origin member
    Vector v2 = ray.getOrigin(); // returns a copy of origin member
    Vector v3 = ray.getOrigin2(); // same as v1, returns origin member
}
origin
不必是函数。
Vector
类可以重载
operator()
,并像调用函数一样进行调用,这就是编译器试图传递的消息

ray.origin
允许任何人对
ray
origin
成员执行任何操作,包括可能对
ray
有害的操作。很不酷。setter和getter的目的是规范对成员变量的访问。目标是自卫

OP的
getOrigin
方法不返回origin。它返回一个origin的副本。恶意的白痴可以在不破坏光线的情况下对副本执行任何他们想要的操作。这通常是正确的方法,除非返回的对象是要修改的或复制成本过高。在这种修改情况下,使用私有数据以及它自己的getter和setter锁定返回的对象。在昂贵复制的情况下,将返回值声明为
const
,以减少损坏的可能性

一个好的setter会在允许更改发生之前检查
成员的所有输入。如果调用者试图输入与
origin
不一致的值,
ray
可以将其关闭

通过
直接访问
origin
允许
ray
无任何防御。它还可以防止
ray
在不改变origin用户的情况下更改origin的实现


这些是否与一对简单的类有关,如
Vector
Ray
,这是一个编码风格和必要性的问题,但将数据访问锁定到最低限度通常是一个好习惯,也是开发复杂软件时的一个必要条件。

origin()
不是类中的函数,它是?我相信说
.origin
而不是
.origin()
会有用。我认为你应该更改标题,你不是在要求点运算符和get之间的区别method@AymanKhamoumaOP认为他们在问这个问题,他们显然没有意识到他们的问题,否则他们就不会发布。
origin()
在您的类中不是函数,是吗?我相信说
.origin
而不是
.origin()
会有用。我认为你应该更改标题,你不是在要求点运算符和get之间的区别method@AymanKhamoumaOP认为他们在问这个问题,他们显然没有意识到他们的问题,否则他们不会发布。好吧,我很傻。。。。另一个问题,执行ray.origin和ray.getOrigin()之间还有什么不同吗?@nevermind
getOrigin()
返回一个副本,所以对它所做的更改不会影响
origin
好的,我是哑巴。。。。另一个问题,执行ray.origin和ray.getOrigin()之间是否还有其他区别?@nevermind
getOrigin()
返回一个副本,因此对其所做的更改不会影响
origin
class Vector {
  public:
    double x, y, z;
    Vector add(Vector v) {
      return Vector(x+v.x, y+v.y, z+v.z);
    }
};

class Ray {
  public:
    Vector origin, direction;
    Vector getOrigin() { return origin; }
    Vector& getOrigin2() { return origin; }
};

int main() {
    Ray ray;
    Vector v1 = ray.origin;  // returns origin member
    Vector v2 = ray.getOrigin(); // returns a copy of origin member
    Vector v3 = ray.getOrigin2(); // same as v1, returns origin member
}