对于我的部分工作,我需要创建一个指向形状对象的指针向量。我有几个不同的类,基类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;
}
}
由于弹出的错误,这是错误的。总而言之,我需要帮助创建指针向量并在函数中使用该向量。提前谢谢。
答案 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 )您也决定,如果对象属于班级Circle
或Rectangle
。
答案 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上的运算符*(),那么仍然无法正常工作。