[Çözüldü] c++ sanal fonksiyon hatalarım

Başlatan desert_eagle, 11 Aralık 2014 - 17:41:46

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

desert_eagle

Merhaba arkadaşlar;
kalıtım ve polimorfizm konularını anlamaya çalışıyorum.
(Derleyici olarak dev c++ kullanıyorum. )
Birinci sorum örneğin a.cpp dosyam var içerisinde aşağıdaki gibi bir kod kullandığım zaman main.c de

a *obj = new a();
    obj->Foo();
şeklinde kullanmak istediğimde    [Linker error] undefined reference to `a::Foo()'  hatası alıyorum.

Anlayamadım neden bu şekide kullanmama izin vermiyor.

a.cpp

class A
{
public:
   void Foo()
   {
       cout << "A::Foo" << endl;
   }
};



a.h

class a
{
public:
    void Foo();
};



2. sorum katılım ile ilgli
Aldığım hata "virtual outside class declaration"
Yardımcı olabilir misiniz

main.c
    a *obj = new b();
    obj->foo();


a.cpp


#include <cstdlib>
#include <iostream>
using namespace std;


class a
{
public:
virtual void foo();
};


virtual void a::foo()
{
        cout<<"a foo"<<endl;
}


a.h


#ifndef a_H
#define a_H

class a
{
public:
virtual void foo();
};

#endif



b.cpp
#include <cstdlib>
#include <iostream>

using namespace std;



class b: public a
{
public:
void foo();
};


void b::foo()
{
        cout<<"b foo"<<endl;
}






b.h

#ifndef b_H
#define b_H

class b:public a
{
public:
void foo();
};

#endif



Saygılar

Amenofis

Sınıf bildirimlerini hatalı yapıyorsun onları düzeltirsen iki sorunda düzelir muhtemelen. Başlık (.h) dosyalarına sadece sınıf ve üye fonksiyonların prototipleri konulur. Bunlar sadece derleyiciye bilgi verme amaçlıdır. .cpp dosyalarına ise içerikleri, yani iş yapan kodlar yazılır. Bir de c++ küçük-büyük harfe duyarlı olduğundan class A ve class a farklı sınıflardır.

// a.h
class A {
public:
void foo();
};

// a.cpp
void A::foo()
{
cout << "foo içinde\n";
}

İstersen hepsini başlık dosyası içine alabilirsin ama bu durumda kodlar her zaman derlenir, kodda değişiklik yapılmasa dahi.

desert_eagle

#2
çözüldü teşekkürler

virtual olarak tanımlamayı virtual void foo() olarak header içinde yaptım cpp dosyasında void foo(){...} olarak normal tanımlayınca çözüldü.