C ++。尖传染媒介和使用传染媒介

时间:2016-11-13 17:14:15

标签: c++ pointers vector

对于我的部分工作,我需要创建一个指向形状对象的指针向量。我有几个不同的类,基类Shape和一些派生类,如Circle和Rectangle。在主要内容中,我需要构造向量,然后将向量传递给将扩展形状尺寸的函数。因此该函数将半径,长度和宽度乘以一定数量。到目前为止,这是我的代码:

vector<Shape*> shapes;
shapes.push_back(circ1);
shapes.push_back(rect1);

circ1和rect 1是Circle和Rectangle类中的对象。我还定义了circ1和rect1,但这里没有包含代码。

我的函数名为expandAll(),这是我试图做的:

void expandAll(vector<Shape*> shapes, int factor)
{
   for (int i = 0; i < shapes.size(); i++)
   {
      shapes[i] = shapes[i] * factor;
   }
}

由于弹出的错误,这是错误的。总而言之,我需要帮助创建指针向量并在函数中使用该向量。提前谢谢。

5 个答案:

答案 0 :(得分:1)

shapes[i]是一个指针。你不能乘以factor。您需要取消引用指针*shapes[i]。这假设您的Shape类(和派生类)覆盖*(乘法,而不是取消引用)运算符。

当你修复它时,将它分配回shapes[i]也将失败。可能你也需要取消引用它。

答案 1 :(得分:0)

您在问题中显示的不完整代码存在多个问题。

shapes

vector<Shape*>

因此,shapes[i]会为您提供Shape *。显示的代码相当于:

Shape *p = shapes[i];

shapes[i] = p * factor;

这个替代方案清楚地表明了问题所在。指向某个对象的指针在C ++中是完全未定义的。没有这样的事情。

在C ++中,你不能乘以指针。那是一个未定义的操作。将指针乘以任何东西是没有意义的。

您最有可能尝试的是重载基础Shapes类中的乘法运算符。

但是,假设您的Shapes类有一个虚拟operator*重载,这仍然无效。这是因为,正如您所描述的那样,Shapes是一个可能是抽象的基类,而且,如您所知,抽象类不可分配/可复制(没有重载运算符,我认为是这里不太可能),如果你的基类不是抽象的,赋值运算符会将它切片。 (更不用说可能的内存泄漏)。

因此,即使Shapes有一个重载的乘法运算符,(*shapes[i]) = (*shapes[i]) * factor;仍然会失败。

这种方法工作的唯一方法是,如果你在抽象基类中虚拟地重载*=运算符,并将其作为

调用
(*shapes[i]) *= factor;

答案 2 :(得分:0)

您的问题是您可能尝试将对象本身

shapes[i] = shapes[i] * factor;

尽管shapes[i]是对象的指针,但这是一个坏主意。

您必须更改(乘)对象的属性,因此请使用

shapes[i] -> radius = (shapes[i] -> radius) * factor;

或 - 更紧凑 -

shapes[i] -> radius *= factor;

我不知道您的形状属性的名称,所以相反或radius使用适当的名称或名称(因为矩形具有宽度并且 hight )您也决定,如果对象属于班级CircleRectangle

答案 3 :(得分:0)

你没有给出代码,但我认为这是关于多态的经典练习。 首先,假设您使用Circle circ1, circ2;创建圈子,那么必须将其地址存储在向量中,因此:

vector<Shape*> shapes;
shapes.push_back( &circ1 );
shapes.push_back( &circ2 );

然后,你的功能应该是:

void expandAll( vector<Shape*>& shapes, int factor)
{
   for (int i = 0; i < shapes.size(); i++)
      *shapes[i] = *shapes[i] * factor;
}

但是这假设您的类都定义了*运算符,如果您是初学者,这可能并不简单。 最好将它作为参考传递,因此整个矢量都不会被复制。

答案 4 :(得分:0)

void expandAll(vector<Shape*>& shapes, int factor)
{
   for (int i = 0; i < shapes.size(); i++)
   {
      *shapes[i] = *shapes[i] * factor;
   }
}

你应该尝试以上这个。

shapes[i] = shapes[i] * factor; // Here you're multypling pointers, instead of objects you want

无论如何,我认为如果没有定义Shape上的运算符*(),那么仍然无法正常工作。