分配不同的 class 对象时,分配未给出预期结果
Assignment is not giving expected result while assigning different class of objects
在下面的代码片段中,我通过赋值运算符将 Box
类型的对象分配给 Circle
类型的对象,但我无法获得预期的结果。
当前执行结果:
圆=6
框=0
预期结果:
圆=6
盒子=0.7
根据下面的代码片段,赋值运算符负责初始化 Box
对象,以便可以将其分配给 Circle
对象。初始化后,Circle
class函数getAreaBox
(Circle
class的成员)将调用getAreabox
(Box
的成员class) 以便在 Circle
class 构造函数中获取当前设置的值。看起来赋值运算符内部没有发生正确的初始化,因此 getAreabox
函数没有返回预期值。
#include <iostream>
using namespace std;
class Box
{
private:
double area;
public:
Box(double areaval=0.0)
{
area=areaval;
}
double getAreabox() const
{
return area;
}
};
class Circle
{
private:
int area;
Box *box;
public:
Circle(int areaval=0,double boxval=0.0):area(areaval)
{
box= new Box(boxval);
}
const Circle& operator =(const Box& obj)
{
if(&obj!=box)
{
delete box;
box= new Box (obj);
}
return *this;
}
int getAreaCircle()
{
return area;
}
double getAreaBox()
{
double val=box->getAreabox();
return val;
}
~Circle(){delete box;}
};
int main() {
Box box;
Circle circle(6,0.7);
cout<<"circle="<<circle.getAreaCircle()<<endl;
circle=box;
cout<<"box="<<circle.getAreaBox()<<endl;
return 0;
}
您的代码完全符合预期。你的期望是错误的。您期望 box = 0.7,但您用语句
覆盖了 box
circle=box;
复制构造函数破坏圆圈内的旧框并创建一个新框作为 'box' 的副本。 'box'有什么价值?
因为你在你的 main
中默认初始化 'box'
Box box;
默认为0,程序会在最后的cout语句中打印0。
cout << "box=" << circle.getAreaBox() << endl;
将打印圆圈内方框的值...已通过变量 'box'.
的复制构造函数初始化
如果将main中的变量'box'改成:
int main() {
Box box(0.9);
...
输出将是:
circle=6, box=0.9
P.S。请不要使用指针 (Box*
)。只是不要。请改用 std::shared_ptr<>
。有很多好的网站解释了原因。您的 class 'circle' 有很多与指针相关的问题。您可以通过阅读
来提高您的编程技能
- 悬挂指针
deep copy
对比 shallow copy
std::shared_ptr<>
和 std::unique_ptr<
>
- 虚拟析构函数
玩得开心...
请查看下面link中我针对您的问题的解决方案。
http://coliru.stacked-crooked.com/a/1bfb63a8eedeefae
分辨率更新:
(1) 原始指针替换为智能指针。
(2) 复制赋值运算符替换为getObject方法,以便在构造函数中获取当前set Box class对象。
(3) 您不需要使用 box 对象构造函数再次设置当前值,因为它会选择在 Circle class 构造函数中设置的相同值。
(4) 不需要在 Circle 中单独使用方法 double getAreaBox() class 因此代码针对相同的方法进行了优化。
我希望这个解决方案能够满足您的需求。
在下面的代码片段中,我通过赋值运算符将 Box
类型的对象分配给 Circle
类型的对象,但我无法获得预期的结果。
当前执行结果:
圆=6
框=0
预期结果:
圆=6
盒子=0.7
根据下面的代码片段,赋值运算符负责初始化 Box
对象,以便可以将其分配给 Circle
对象。初始化后,Circle
class函数getAreaBox
(Circle
class的成员)将调用getAreabox
(Box
的成员class) 以便在 Circle
class 构造函数中获取当前设置的值。看起来赋值运算符内部没有发生正确的初始化,因此 getAreabox
函数没有返回预期值。
#include <iostream>
using namespace std;
class Box
{
private:
double area;
public:
Box(double areaval=0.0)
{
area=areaval;
}
double getAreabox() const
{
return area;
}
};
class Circle
{
private:
int area;
Box *box;
public:
Circle(int areaval=0,double boxval=0.0):area(areaval)
{
box= new Box(boxval);
}
const Circle& operator =(const Box& obj)
{
if(&obj!=box)
{
delete box;
box= new Box (obj);
}
return *this;
}
int getAreaCircle()
{
return area;
}
double getAreaBox()
{
double val=box->getAreabox();
return val;
}
~Circle(){delete box;}
};
int main() {
Box box;
Circle circle(6,0.7);
cout<<"circle="<<circle.getAreaCircle()<<endl;
circle=box;
cout<<"box="<<circle.getAreaBox()<<endl;
return 0;
}
您的代码完全符合预期。你的期望是错误的。您期望 box = 0.7,但您用语句
覆盖了 boxcircle=box;
复制构造函数破坏圆圈内的旧框并创建一个新框作为 'box' 的副本。 'box'有什么价值?
因为你在你的 main
中默认初始化 'box'Box box;
默认为0,程序会在最后的cout语句中打印0。
cout << "box=" << circle.getAreaBox() << endl;
将打印圆圈内方框的值...已通过变量 'box'.
的复制构造函数初始化如果将main中的变量'box'改成:
int main() {
Box box(0.9);
...
输出将是:
circle=6, box=0.9
P.S。请不要使用指针 (Box*
)。只是不要。请改用 std::shared_ptr<>
。有很多好的网站解释了原因。您的 class 'circle' 有很多与指针相关的问题。您可以通过阅读
- 悬挂指针
deep copy
对比shallow copy
std::shared_ptr<>
和std::unique_ptr<
>- 虚拟析构函数
玩得开心...
请查看下面link中我针对您的问题的解决方案。
http://coliru.stacked-crooked.com/a/1bfb63a8eedeefae
分辨率更新:
(1) 原始指针替换为智能指针。
(2) 复制赋值运算符替换为getObject方法,以便在构造函数中获取当前set Box class对象。
(3) 您不需要使用 box 对象构造函数再次设置当前值,因为它会选择在 Circle class 构造函数中设置的相同值。
(4) 不需要在 Circle 中单独使用方法 double getAreaBox() class 因此代码针对相同的方法进行了优化。
我希望这个解决方案能够满足您的需求。