gpt4 book ai didi

c++ - 使用引用或指针组合?

转载 作者:太空狗 更新时间:2023-10-29 20:00:45 26 4
gpt4 key购买 nike

请告诉我哪个好

假设我有这样一个类

class Shape
{
public:
virtual void Display()
{
cout << "Shape::Display()" << endl;
}
};

class Line : public Shape
{
public:
void Display()
{
cout << "Line::Display()" << endl;
}
};

class Circle : public Shape
{
public:
void Display()
{
cout << "Circle::Display()" << endl;
}
};

1)

class Container
{
public:
Container(Shape& shape) : m_Shape(shape)
{

}

void Draw()
{
m_Shape.Display();
}
private:
Shape& m_Shape;
};

这里他是拿引用赋值给基类对象。

2)

class ShapeContainer
{
public:
ShapeContainer(Shape* pShape) : m_pShape(pShape)
{

}
void Draw()
{
m_pShape->Display();
}

private:
Shape* m_pShape;
};

这里他是拿指针赋值给基类对象。

请告诉我哪个好,什么时候用

最佳答案

必须根据您想对对象做什么来做出决定。由于您不包括存储值的选项,因此我假设您需要容器来引用外部对象。如果这不是必需的,请考虑使用标准容器的功能:存储对象的拷贝。

通过使用引用,您可以避免在创建时检查 NULL(在创建后,两种解决方案都存在相同的问题:外部对象可能会被销毁,留下悬空引用和未定义的行为)。引用的语义要强一些,任何阅读代码的人都会立即理解:这个容器的目的是在容器的整个生命周期内保存对该对象的引用,对象生命周期由外部管理.

不利的一面是,引用是不可重置的,一旦你设置了一个引用,它就变成了对象的别名,你不能重置它来引用不同的对象。这意味着默认情况下,持有引用的容器将不可分配,因为您不能使其引用不同的对象。即使您提供自定义赋值运算符,引用也无法更改,它会继续引用旧对象。您将无法在容器中提供成员函数来引用不同的对象:一旦您设置了一个引用,它就永远被设置了。

另一方面,指针可以为 NULL,因此您可能希望/需要在使用前检查指针的有效性。它们是可重置的,您可以提供操作让您的容器随时引用不同的对象,默认情况下容器是可分配的。不利的一面是,指针可以在不同的场景中使用,因此语义不是那么清晰。特别是,您必须在接口(interface)上仔细记录容器是否拥有指针的所有权(以及释放内存的责任)。如果您要处理容器内的所有权,请考虑使用智能指针(或者如果可以的话,只复制一份并忘记原始文件,这样更不容易出错)。

关于c++ - 使用引用或指针组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5088429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com