2011-11-28 116 views
0
#include <iostream> 
using namespace std; 
class Shape 
{ 
    public: 
    virtual void draw()=0; 
}; 
class Circle:public Shape 
{ 
    public: 
    void draw(){cout<<"circle "<<endl;} 
}; 
class Rectangle:public Shape 
{ 
    public: 
    void draw(){cout<<"Rectangle "<<endl;} 
}; 

我想創建一個圖片類,我可以繪製不同的形狀。我傳遞Shape類指針(摘要)中的圖片類的構造函數那樣:編譯錯誤:將抽象類作爲參數傳遞給類構造函數

class Picture 
{ 
    public: 
     Shape* s1; 
     Picture(Shape *fp): s1(new Shape){} 
     void PictureDrawn() 
     { 
      s1->draw(); 
     } 
}; 

int main() 
{ 
    Circle cir; 
    Picture pic(cir); 
    pic.PictureDrawn(); 

}

我收到編譯錯誤。請任何人解釋如何正確地寫圖片類的構造函數,以便我可以做出不同的形狀?由於

回答

8

你不能做

​​

這是一個嘗試實例化抽象類。我認爲你想要做的是:

Picture(Shape *fp): s1(fp){} 

這將指派參數爲s1變量,這是我認爲你的意圖。

另請注意,您底部的代碼也不正確。你已經將圖片構造函數聲明爲一個指向Shape的指針,但是你將傳入Circle的值。你想要的是。

Circle cir; 
Picture pic(&cir); 

或者,更改Picture類,以便它使用引用而不是指針。

+0

謝謝@Nrdtron。有用!! – Alok

+1

接受他的答案然後:) –

+1

@Alok是的,如果答案是正確的,你應該接受它 - 點擊複選標記。然後有人問到後來可以立即看到有一個可以接受的答案,這也可以幫助他們。 – Nerdtron

0

如果您想複製動態分配的形狀,使其可複製(→ FAQ link)。

表示添加方法virtual Shape* clone() const = 0

在從Shape派生的每個具體類中實現它。

自動執行clone最實用的方法,是恕我直言定義一個宏。

但是由於年輕的SO讀者對任何定義宏的建議都有激烈的反應歷史,讓我補充一點,在C++ 11中,替代方案是使用奇怪的循環模板模式來實現clone實現(因爲C++ 11支持參數轉發),並且在C++ 98中,還有另一種,但是相當複雜!,另一種方法是基於繼承層次結構中的優勢。然而,說了這麼多,讓我再次提出這個宏,或者簡單地在每個類中寫入相同的實現(無名變體)。

歡呼&心連心,

+1

不,我認爲他只是有一個錯字 - 查看Picture類的構造函數。 – Nerdtron

+2

@anonymous downvoter:downvoting沒有任何解釋的舊答案對任何人都沒有幫助。正如我所看到的,答案非常好。當你拒絕透露時,我或其他人怎麼能瞭解你的相反見解? –

0

如果我理解正確的話,你的抽象類形狀的接口,因爲它所有的方法都是純虛。話雖如此,你不能實例化一個接口。您必須「聲明」非虛擬純方法或傳入指向您的類的指針。

1
class Picture 
{ 
    public: 
     Shape* s1; 
     Picture(Shape *fp): s1(fp){} 
     void PictureDrawn() 
     { 
      if(s1 != NULL) 
       s1->draw(); 
     } 
}; 

int main() 
{ 
    Circle cir; 
    Picture pic(&cir); 
    pic.PictureDrawn(); 

} 
相關問題