İ.T.Ü.

Bilişim Enstitüsü

 

 

2. Vize

10.04.2002

Tezsiz Yüksek Lisans Programı

Nesneye Dayalı Programlama

 

class A

{

   public:

   A() {  cout << "A's constructor\n" ;  }

   virtual ~A() { cout << "A's destructor\n" ;  }

};

class B

{

   public:

   B() { cout << "B's constructor\n" ; }

   ~B() { cout << "B's destructor\n" ; }

} ;

class C : public A, public B

{

   public:

   C() { cout << "C's constructor\n" ; }

   ~C() { cout << "C's destructor\n" ; }

} ;

 

main()

{

1:           A *a ;

2:           B  *b;

3:           a = new C ;

4:           b = new C ;

5:           delete a ;

6:           delete b ;

}

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


S.1) a) (25)  Yukarıda verilen sınıf tanımlamaları için main() fonksiyonu içindeki numaralı satırlarda üretilen çıktıyı nedenleri ile birlikte açıklayınız.

 

Satır No

Ekran Çıktısı

Açıklama

1

 

Herhangi bir nesne yaratılmıyor

2

 

Herhangi bir nesne yaratılmıyor

3

A’s constructor

B’s constructor

C’s constructor

C sınıfından bir nesne yaratılıyor

4

A’s constructor

B’s constructor

C’s constructor

C sınıfından bir nesne yaratılıyor

5

C’s destructor

B’s destructor

A’s destructor

C sınıfından bir nesne yok ediliyor

Temel sınıfın yokedicisi virtual tanımlı.

6

B’s destructor

C sınıfından bir nesne yok ediliyor

Temel sınıfın yokedicisi virtual tanımlı değil.

 

 

 

S.1)  b) (5) Sınıf tasarımında herhangi bir hata var mı? Var ise düzeltiniz.

 

B sınıfının yokedicisi virtual tanımlanmalı.

class B

{

   public:

   B() { cout << "B's constructor\n" ; }

   virtual ~B() { cout << "B's destructor\n" ; }

} ;

 

S.2) Herhangi bir tipten diziyi modellemek üzere bir sınıf tasarlanılması istenmektedir.

A) (5) Böyle bir sınıfın öznitelikleri neler olabilir?

           Dizinin elemanlarının saklanacagi bir kap

           Kaptaki eleman sayısı

 

B) (15) A şıkkında verdiğiniz özniteliklere ek olarak sınıfta Sort() adlı bir metod yer almaktadır. Sınıfın sadece prototipini yazınız.

template <class T>

class Array {

        protected:

             T* data ;

             int numberOfElements ;

        public:

             Array() ;

             Array(T*,int) ;

             ~Array();

            void Sort() ;

            Array& operator=(Array&) ;

            T operator[](int) ;

};

 

C) (25) Sort metodunu gerçekleyiniz.

 

template <class T>

void Array<T>::Sort(){

        if (numberOfElements>0){

           int s ;

           for (int i=0;i<numberOfElements-1;i++)

                for (int j=i+1;i<numberOfElements;j++)

                     if (data[i]>data[j]){

                         s = data[i] ;

                         data[i] = data[j] ;

                         data[j] = s ;     

                     }

        }

}

class Square

{

         double edge ;

      public:

         Square(double e):edge(e){}

         virtual double getArea(){ return edge*edge;}

} ;

 

class Cube : private Square

{

      public:

         Cube(double e):Square(e){}

         double getArea(){ return (6.0*Square::getArea())  ;}

} ;

 

Aşağıdaki soruları yukarıdaki sınıf tanımlamalarını gözönüne alarak cevaplayınız.

 

S.3) (10) Aşağıdaki şıklardan hangisinde bir “late-binding” uygulaması sözkonusudur.

 

S.4) (10) Cube sınıfındaki getArea() metodunun aşağıdaki şekilde tanımlanması durumunda

 

                        double getArea(){ return (6.0*area*area);}

 

kodun mantıksal olarak çalışabilmesi için Cube yada Square sınıfında yapılması gereken değişiklik aşağıdaki şıklardan hangisinde verilmiştir?

 

(a)    class Cube: public Square

(b)   Cube sınıfında edge adında public bir üye tanıtılır.

(c)    Square sınıfındaki edge üyesi protected olarak tanımlanır.

(d)   Cube sınıfında edge adında protected bir üye tanıtılır.

 

 

 

 

 

 

 

S.5) (25) Square sınıfında aşağıdaki değişiklik yapılsın.

 

class Square

{

         double edge ;

      public:

         Square(double e)

         {

               if (e<0.0)

                  throw ENegativeEdge(“Edge cannot be negative”,e) ;

              edge = e ;

         }

         virtual double getArea(){ return edge*edge;}

} ;

 

ENegativeEdge sınıfını tasarlayınız. try-catch yapısının kullanımına bir örnek veriniz.

 

class ENegativeEdge

{

         protected:

              char* msg ;

              double edge ;

         public:

              ENegativeEdge() ;

              ENegativeEdge(char *,double) ;

              ~ENegativeEdge() ;

             char* getReason() ;

             double getEdge() ;

} ;

 

ENegativeEdge::ENegativeEdge()

{

            msg = 0L ;

            edge=0.0;

}

 

ENegativeEdge::~ENegativeEdge()

{

          if (!msg) delete[] msg ;

}

 

ENegativeEdge::ENegativeEdge(char *s,double e):edge(e)

{

           msg = new char[strlen(s)+1] ;

           strcpy(msg,s) ;

}

 

char* ENegativeEdge::getReason()

{

      return msg ;

}

 

double ENegativeEdge::getEdge()

{

      return edge ;

}

 

main()

{

      try

     {

         Square s(-1) ;

     }

     catch(ENegativeEdge& e)

     {

            cout << e.getReason() << “\n” ;

            cout << e.getEdge() << “\n” ;

     }

}