2016-11-13 187 views
0

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

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; 
    } 
} 

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

+0

“由于弹出的错误。”哪一个? – tkausl

+1

矢量由你的老师授权的指针吗?我这样问是因为我一般不推荐它。 –

+0

如果你真的需要一个指针向量,你想使用智能指针而不是行指针。 –

回答

1

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

而当您修复该问题时,将其重新分配给shapes[i]也会失败。可能你也需要解除引用。

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; 
0

你的问题的唯一方法是,你可能尝试乘以对象本身

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

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

你必须改变(乘)的属性的对象的,所以使用的东西作为

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

或 - 更紧凑 -

shapes[i] -> radius *= factor; 

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

0

你不给代码,但我认为这是关于多态的经典练习。 因此,首先,假设你有Circle circ1, circ2;创建圈子,那么你必须店自己在矢量ADRESS,即:

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; 
} 

但这是假设如果你是初学者,你的课程全部定义了操作员,这可能不是微不足道的。 它更好地传递它作为参考,所以整个向量不会被复制。

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上的运算符*(),仍然不起作用。