2016-11-13 294 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上的運算符*(),仍然不起作用。