2013-10-11 98 views
1

我有這個功能創建實例類的數組 - 語法

# include "Rectangle.hh" 
# include "Circle.hh" 

void inst_obj (int symbols) { 

    for (int i=0; i<symbols ; i++) { 
    if (i<10) { 
     Rectangle symb(1,2,3); 
     //Store symb in an array, like symb_array[i] = symb; 
    } 
    else { 
     Circle symb(1,2,3,4); 
     //Store symb in an array, like symb_array[i] = symb; 
    } 

    }// inst_obj 

然後我還有一個功能:

void check_symbols(symbols) { 

    for (int i=0; i<symbols; i++) { 
     // Check symbol objects, like symb_array[i].return_something 
    } 
    } // check_symbols 

你怎麼能指針不同的對象存儲在一個簡單的方法? (以及你如何訪問它們)?

+0

什麼是更大的設計?你有像'Shape'這樣的基類嗎?Rectangle和Circle是從哪個基類中派生出來的?你需要一個容器來存儲創建的對象嗎?請具體說明您需要的內容,並解釋迄今爲止所做的工作。容器通常綁定到C++中的單個元素類型,除非您執行某種類型的擦除。 – legends2k

回答

0

您可以創建一個基類Shape,使RectangleCircle都繼承該類,並使您的數組的類型爲Shape *

這個數組可以容納指向RectangleCircle對象的指針,因爲它們都是Shape對象。

+1

製作'Shape *'類型的數組(或其他一些等價的指針)。多態性需要指針或引用,它不適用於對象。 – john

+0

@john:謝謝,回答編輯 –

+1

@ Mhd.Tahawi:不要誤會我,但你的編輯仍然是錯誤的。不是因爲OP需要,而是在C++中爲運行時多態性需要指針/引用,否則最終會出現[slicing](http://stackoverflow.com/q/274626/183120)的問題。 – legends2k

-1

您可以爲此使用繼承。

有一個基類Shape(最好是一個抽象類,帶有純虛擬方法,如draw()等)。從Shape繼承Rectangle,Circle和其他形狀。

Shape或Shape的向量可以容納從Shape類繼承的任何對象的實例。

我們需要使用指向Shape的指針數組來使多態性正常工作。

+0

與其他答案相同的錯誤,Polymorphism需要指針或引用,它不適用於對象。正確的說法是 - 形狀指針的數組或向量可以保存指向派生對象的指針,並通過虛擬函數訪問這些對象。 – john

2

您可以返回一個指向矢量的指針,它指向inst_obj中的基礎對象,並將其傳遞給check_symbols()函數。就像這樣:

// assume Shape is base type of Rectangle and Circle 

std::vector<std::unique_ptr<Shape>> inst_obj (int symbols) 
{ 
    std::vector<std::shared_ptr<Shape>> v; 

    for (int i=0; i<symbols ; i++) 
    { 
    if (i<10) 
    { 
     v.push_back(std::unique_ptr<Shape>(new Rectangle (1,2,3))); 
    } 
    else 
    { 
     v.push_back(std::unique_ptr<Shape>(new Circle (1,2,3,4))); 
    } 
    return v; 
    } 

void check_symbols(std::vector<std::unique_ptr<Shape>>& v) 
{ 
    for(auto it = v.begin(), it != v.end(); ++it) 
    { 
     // Check symbol objects, like symb_array[i].return_something 
    } 
} 

用法:

std::vector<std::unique_ptr<Shape>> v = inst_obj(43); 
check_symbols(v);