2016-03-18 24 views
-2

şekil şeklinde bir soyut dersim var.Bir soyut veri tipinin parametresi nasıl bulunur?

class Shape{ 
public: 
    virtual const ColorRGB getColor() const; 
    virtual double rayIntersectionDistance(Ray r) = 0; 
}; 

Ve şimdi Şekli aşağıdaki sınıfları türetilen ettik.

  • class Sphere: public Shape { //implementation goes here }
  • Hem getcolor uyguladık
  • class Plane: public Shape { //implementation goes here }
    1. ()
      ve rayIntersectionDistance (Ray r) bu sınıflara özgü ek yöntemler ile her iki sınıfları içinde yöntem. Şimdi Yani

      , Sahne adında başka bir sınıfta, içinde, bir ) ( yöntemini hale ettik ve bu en prototipidir:

      void render(int width, int height, Shape s); 
      

      Ve bu çalışmıyor gibi görünüyor, derleyici olduğunu şikayetçi bana:

      error: cannot declare parameter 's' to be of abstract type 'Shape'

      Bunu nasıl yapabilirim? Bunu başarmanın daha iyi bir yolu ne olurdu?

    cevap

    3

    Shape10 değerini geçmek, Shape örneğini iletmek anlamına gelir. Ama Shape soyut, bu yüzden bir örnek oluşturulamıyor.

    Bunun yerine bir işaretçi veya referansı geçirin. const, değiştirilmek üzere geçirilen nesneyi (const olarak bildirilen nesnelerin geçirilmemesini de önleyecek şekilde değiştirilmediğini) belirtin.

    void func(Shape &s); // define these functions as required 
    void func2(Shape *s); 
    void func3(const Shape &s); 
    
    int main() 
    { 
         Sphere s; // assumed non-abstract 
    
         const Sphere s2; 
    
         func(s);  // will work 
         func2(&s); // ditto 
    
         func3(s); // okay 
         func3(s2); // okay 
    
         func(s); // rejected, as s2 is const 
    } 
    

    Düzenleme:

    yorumlarda Barry tarafından belirtildiği gibi

    , böyle std::unique_pointer<Shape> veya std::shared_pointer<Shape> akıllı işaretçileri, geçmek de mümkündür - ve bu değere göre geçirilebilir. Bu mümkün olsa da, Richard Hodges tarafından belirtildiği gibi, bu alışılmadık bir durumdur. Aslında, bir gösterici veya referansı Shape'a yönlendiren herhangi bir tip, yapıcılarının (özellikle kopya kurucusu) uygun davranışı uyguladığı varsayılarak geçirilebilir. `( unique_ptr)

    +3

    ' func4, 'func5 (Shared_ptr )' ... ;-) – Barry

    +2

    @barry bir olağandışı olurdu beraberlik işlevine unique_ptr taşındı geçen adil olmak. @Peter Muhtemelen func() 'veya' func2() 'yi teşvik etmem. çok kötüye giden yol ... 'func3()' bir tanesidir. –

    +0

    @Barry - yes. Ayrıca, bu türün kendi durumunu uygun şekilde yönetmesi koşuluyla, bir işaretçi veya "Şekil" referansını içeren herhangi bir türün - bahsettiğiniz gibi akıllı işaretçi türleri de dahil olmak üzere - iletilmesi de mümkündür. – Peter