Çözüldü C++parametre olarak veri tipi nasıl kullanılır?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.
Katılım
18 Aralık 2018
Mesajlar
9.031
Makaleler
14
Çözümler
128
Yer
Dubai
STL veya STD kullanmadan class Deque yazmamız gerekiyor. Class'ın orijinalini dökümanlardan okuyarak yazmaya başladım ancak class normalde template ile yazılmış. Bizimse template kullanmamız yasak.

Bu durumda her fonksiyonu overload etmem gerekiyor. Fakat bunun da şöyle bir sorunu var; eğer kullanıcı integer bir deque kullanmaya başlarsa hala char deque fonksiyonlarına da erişebilir. Bu da belli başlı hatalara sebep olacak. Eğer ayrı ayrı classlar yaparsam örneğin intDeque, charDeque gibi bu seferde tek bir class değil iki farklı class oluşturmuş oluyorum. Bunları mainde böyle çağırabilirim. Bununla ilgili bir sorun olur mu bilmiyorum ama hocamız bir tık katı, sorun yaratacaktır tahminen. Bu yüzden aklıma constructor içerisinde veri tipini isteyip istenen veri tipine göre bir diğer classa çağrı yapmasını sağlayabilirim. Böylece mainde tek nesne oluşturmuş olurum ve bu tek nesne ile istersem int istersem char deque döndürebilirim diye düşündüm. Her üye fonksiyona da if else ile char veya int döndürüp döndürmemelerini sağlayabilirim. Ancak bunun için parametre olarak data type yerleştirmek gerekiyor. Mümkün mü bu?
 
Son düzenleyen: Moderatör:
Çözüm
Yazarak pek anlatamam birkaç satır karaladım, demek istediğim şey buna benzer bir yapı.

C++:
#include <iostream>
#include <cstring>

using namespace std;

class Array {

    void *arr;
    int size;
    int index;
    public:
    Array(int array_size, int type_size)
        :arr(nullptr), size(type_size), index(0) {

        arr    = new byte[array_size * type_size];   

    }

    void append(void *data) {

        memcpy(arr+index, data, size);
        index+=size;
    }

    void * get(int n) {

        return arr+(n*size);
    }

};


int main() {

    Array arrInt(10, sizeof(int));

    int a=23;
    int b=32;
    arrInt.append(&a);
    arrInt.append(&b);   

    cout << *(int*)arrInt.get(0) << endl;
    cout << *(int*)arrInt.get(1) << endl;


    Array arrChar(10, sizeof(char));
    char c='C';
    char d='D';

    arrChar.append(&c);
    arrChar.append(&d);   

    cout << *(char*)arrChar.get(0) << endl;
    cout << *(char*)arrChar.get(1) << endl;



    return 0;
}
Herhangi bir veri yapısını multiple desteği eklemek istiyorsan verinin türü değil bellekte kapladığı yer üzerinden bir sınıf tasarlarsın. A türü 4 byte B türü 4 byte ise bu veri aynı bellek alanını işgal eder dolayısıyla bizim sadece verinin bellekte tutulacağı birim alanı bilmemiz yeterli olur. Örn constructorda veri boyutunu bildiririz, deqInt data( sizeof(int)); eklemek için tür bağımsız bir fonksiyon tanımlarız insert(node **m, const void *data); gibi. Bu C ye dayalı bir çözüm aslında, oop bağımsız bir yöntem. Template ya da function overload kullanmadan ancak böyle yapılabilir.
 
Biraz daha açıklar mısınız?
 
Yazarak pek anlatamam birkaç satır karaladım, demek istediğim şey buna benzer bir yapı.

C++:
#include <iostream>
#include <cstring>

using namespace std;

class Array {

    void *arr;
    int size;
    int index;
    public:
    Array(int array_size, int type_size)
        :arr(nullptr), size(type_size), index(0) {

        arr    = new byte[array_size * type_size];   

    }

    void append(void *data) {

        memcpy(arr+index, data, size);
        index+=size;
    }

    void * get(int n) {

        return arr+(n*size);
    }

};


int main() {

    Array arrInt(10, sizeof(int));

    int a=23;
    int b=32;
    arrInt.append(&a);
    arrInt.append(&b);   

    cout << *(int*)arrInt.get(0) << endl;
    cout << *(int*)arrInt.get(1) << endl;


    Array arrChar(10, sizeof(char));
    char c='C';
    char d='D';

    arrChar.append(&c);
    arrChar.append(&d);   

    cout << *(char*)arrChar.get(0) << endl;
    cout << *(char*)arrChar.get(1) << endl;



    return 0;
}
 
Çözüm
Mantığı hemen hemen anladım ancak yazdığınız kodu çalıştırırken nullptr ve byte tanımlanmamış diyor. Bir kütüphanenin içerisinde mi bunlar?
Ekleme;


-std=c++0x compiler'a bunu ekleyip nullptr'ı çözdüm. Byte ise <windows.h> içeriğine dahilmiş. Bunu STD olarak kabul etmez hocam sanırım ama emin de değilim. Yine de verdiğiniz yöntemi anladım. Hocama bunu kullanıp kullanamayacağımı sorduktan sonra kodları buna göre entegre etmeye başlarım. Teşekkür ederim.
 
Byte aslında unsigned char'dır, byte yerine unsigned char da kullanabilirsin. memcpy fonksiyonunu da kendin yazabilirsin, iostream harici kitaplık kullanmana gerek yok.

Dediğin gibi hocana bir sor tam olarak ne istiyor ona göre bir model geliştir, ben bir fikir vermiş oldum. Kolay gelsin.
 
Byte aslında unsigned char'dır, byte yerine unsigned char da kullanabilirsin. memcpy fonksiyonunu da kendin yazabilirsin, iostream harici kitaplık kullanmana gerek yok.
Byte'a bakıyordum STD dahilmiş ona bakıyordum ne yapılabilir diye. Teşekkür ederim. memcpy fonksiyonunu da buldum nasıl yazılacağını.
Yardımınız sağ olsun tek bir std üyesi sınıf veya fonksiyon kullanmadan programı bitirdim. Kullandığım yöntemi hocanın onaylamasını bekliyorum.
 
Son düzenleme:
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…