用于访问类中的类对象的函数

Function for accessing class object within class

本文关键字:对象 函数 访问 用于      更新时间:2023-10-16

我有一个名为Position的类,它包含成员变量X,Y和Z,以及其他一些公共成员函数。

class Position{
public:
void SetPos(double X, double Y, double Z);
private:
double X, Y, Z; 
};

然后我有另一个类,其中包含一个"位置"作为私有成员变量。

class NewClass{
public:
Postion GetPos();
private:
Position classPos;
};
Position NewClass:GetPos() { return classPos;}

我正在尝试做的是通过使用 GetPos 函数访问 NewClass 中的 classPos,如下所示:

SomeFunction(NewClass.GetPos());
Position new_pos = NewClass.GetPos();

但是,当我这样做时,它总是分配或传递不正确的值 (1e61)。我确实有 = 运算符重载,当我通过函数(运算符函数)单步执行时,正确的值就在那里,但是在退出时它会恢复为 1e61 值。

GetPos 是一个对对象而不是调用的函数。

NewClass newClassObject;
Position p = newClassObject.GetPos();
SomeFunction(p);

我想通了。我不得不更改函数以通过引用返回

class NewClass{
const Position& GetPos();
private:
Positon classPos;
};
const Position& NewClass::GetPos() { return classPos;}

(我假设Position是一个默认复制构造函数是不够的类,即浅拷贝将导致未定义的行为。我也忽略了您在评论中指出的明显错别字,您知道它们。

在任一示例中都不会调用赋值运算符重载。按值将对象传递给函数会调用移动或复制构造函数,前提是未省略副本。第二个例子

Position new_pos = some_new_class.GetPos();

是副本初始化的一个示例。此语句也不会调用operator=。尽管语法如此,但由于 rhs 的类型为 Position,它实际使用的还是复制构造函数。通常,复制初始化将仅考虑非显式构造函数和用户定义的转换。