我有一个名为Position的类,它包含成员变量X,Y和Z,以及一些其他公共成员函数。
class Position{
public:
void SetPos(double X, double Y, double Z);
private:
double X, Y, Z;
};
然后我有另一个包含“Position”作为私有成员变量的类。
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值。
答案 0 :(得分:0)
GetPos是您在对象上调用的函数,而不是类。
NewClass newClassObject;
Position p = newClassObject.GetPos();
SomeFunction(p);
答案 1 :(得分:0)
我明白了。 我不得不将函数更改为按引用返回
class NewClass{
const Position& GetPos();
private:
Positon classPos;
};
const Position& NewClass::GetPos() { return classPos;}
答案 2 :(得分:0)
(我假设Position
是一个默认拷贝构造函数不足的类,即浅拷贝会导致未定义的行为。我也忽略了你在评论中指出的显而易见的拼写错误意识到它们。)
在任何一个示例中都不会调用赋值运算符重载。通过值将对象传递给函数会调用移动或复制构造函数,假设副本没有被删除。第二个例子
Position new_pos = some_new_class.GetPos();
是copy initialization的示例。该声明也不会调用operator=
。尽管有语法,它实际使用的是什么,因为rhs的类型为Position
,它是复制构造函数。通常,复制初始化仅考虑非显式构造函数和用户定义的转换。