Çarpraz includeler sorun çıkarır. include koruması koymalısınız ya da pragma once kullanmak lazım. Include koruması. h dosyası içine asd. h olsun #ifndef ASD_H #define ASD_H / h. dosyası içeriği... ... / #endif Bu arada player nesnesi zaten bir tane değil mi? vectorün içinde zaten referansı tutuluyor. Başka bir yerde daha bu referansı tutarsan sorun kalmaz çünkü gerçekten ulaşman gerektiğinde player'ı bulursun ve cast yapmana gerek kalmaz :) Ben olsam entityleri playerdan tamamen soyutlarım . Oyuncu nesnem, oyuncunun grebileceği tüm entityleri kendisi saklar. Defineleri zaten koyuyorum hocam. Pragma'yı aşağıdaki gibi yaptım bir yanlışlık mı var?#pragma once#ifndef CAMERA_H#define CAMERA_H... #endif Oyuncu'yu ayırmak istemiyorum çünkü nceden dediğim gibi update, render vs. yapmak için ayrı ayrı kod yazmak ktü bir yol gibi geliyor. EntityManager içinde bir referansı olması en iyi yol sanırım. NmC bunu yazdı 2-3 mesaj nce yazdığım Forward declaration konusuna bak hocam :) Hocam mesajı okuyunca bakmıştım da açıkçası birşey anlayamadım ingilizcem çok iyi değil. :)

2-3 mesaj nce yazdığım Forward declaration konusuna bak hocam :) There are 10 types of people in the world. Those who knows binary and those who dont...

Teşekkürler ikinize de, dediğiniz gibi virtual olarak tanımlayınca sorun halloldu. Dngüde de ufak bir değişiklik yapmam gerekti: for (std::vector<Entity >::iterator i = entities. begin ; i!= entities. end ; ++i) ->Update ;}Interface işi çok uzatır da Entity'yi ya da ondan nce EntityBase falan diye bi sınıfı abstract yapabilirim. Ama şimdilik projede biraz yol almaya çalışacağım. Bu arada problemin adı slicing imiş: http://stackoverflow.com/questions/274626/what-is-object-slicing Tekrar teşekkürler.

Entity. h içerisinde class Camera; class Entity şeklinde yap tanımlamanı. Camera. h'ı include etme. Daha sonra Camera. h içerisinde Entity. h'ı include ederek kullanmayı bir dene. Aşağıdaki gibi bi hata verdi hocam; src/Entity. cpp: In member function 'int Entity::GetX ':src/Entity. cpp:148:28: error: invalid use of incomplete type 'class Camera' return rect. x + _camera->GetPosition . x; ^In file included from src/Entity. cpp:2:0:include/Entity. h:7:7: error: forward declaration of 'class Camera' class Camera; Header'lar aşağıdaki gibi;

Nasıl bir şeye ihtiyacın olduğunu bir yazsana. rneğin X, Y, Z sınıfları olacak, T jenerik listede tutulacak. X, Y -> a, b, c metotlarına; Z ise c, e metotlarına sahip olacak gibi. rneğin ortak metot c ve hepsinde ortak bir şey dndürüyorsa base'in c metodu olmalı. X ve Y base'in deliveredından türetilmeli. Z ise base'den kalıtım alarak e methoduna sahip olmalı gibi. Bu metotların zelliğine gre de virtuallığı belirlenecek. Olaylara karışmayın!

http://www.learncpp.com/cpp-tutorial/121-pointers-and-references-to-the-base-class-of-derived-objects/ Virtual Function ile tanış bakalım :) There are 10 types of people in the world. Those who knows binary and those who dont...

Dediğimin tam tersini de bi deneyebilir misin? Bir de benim dediğimi yapmadan nce tam olarak ne hata veriyordu? Malesef hocam, yine aynı hatayı verdi. Daha nceki hata şuydu; In file included from include/Entity. h:6:0, from include/Block. h:6, from src/Block. cpp:1:include/Camera. h:25:29: error: 'Entity' has not been declared void SetFollowingEntity ; ^include/Camera. h:30:5: error: 'Entity' does not name a type Entity followingEntity;

İşte diyorum senin çzümün abstract sınıf:) base'in elemanlarına miras alan sınıfta doğrudan base sınıfın isim uzayından erişilebilir. rneğin Base::AMethod ; rnek: http://ideone.com/pUEmeo #include <iostream> using namespace std; class Base { public: virtual void BaseMethod }; class Delivered : public Base { public: void BaseMethod }; int main Olaylara karışmayın!

uLtRaLoVeR bunu yazdı Waze bunu yazdı Hocam aslında yapıyı bozmuyor şu an. Entity Manager dediği class içerisinde yapıyor bunu. Ve 1vsAll durumu sz konusu. Diğerlerinin tiplerini bilmesine gerek yok, sadece içlerinden bir veya birkaçı Player tipinde ise onlara ekstra bir muamelede bulunuyor :) Yeni bir entity türü Player gibi ekstra bir muamele grmeyecekse ekstra kod eklemesini gerektiren bir durum yok :) Virtual kullanmadan yapmak isterse nce entity vectorunden pointer'ları alıp sırayla player'a cast etmeyi deneyecek. Eğer cast başarılı olursa onun, olmazsa nceki halinin update fonksiyonunu çağıracak. Buraya kadar hem fikiriz sanırım. Şimdi bir de farklı bir entity ekleyelim. Stoper olsun o da. Entity manager içerisindeki bu dngünün içine bir de stoper'e cast etmeyi denemeyi eklemek zorundayız bundan bahsettim ben. Entity classının değil, entity manager'ın tüm entity türlerinden haberi olması gerekiyor bu durumda. nceki yorumda o kısmı yanlış belirtmişim. Ama bana yine de mantıksız geliyor. Entity manager olaya daha soyut bi şekilde, doğrudan entity diyerek bakmalı bence, alt sınıfını bilmeden.

NmC hocam sorunu dediğin gibi çzdüm. yle karışıklık falan da olmadı tek seferde çalışınca gzlerim yaşardı. :D Teşekkürler. for (std::vector<Entity >::iterator i = entities. begin ; i!= entities. end ; ++i) { if (Player player = dynamic_cast<Player > else } uLtRaLoVeR hocam daha akılcı bi çzüm varsa çok ğrenmek isterim. Bahsettiğim şey bundan çok farklı değildi. update methodunu çağırırken cast edip çağırırsan virtual olmasına gerek kalmaz. Ama dediğim gibi entity sınıfının tüm alt sınıflarını bilmesi lazım. Bu da nesneye ynelik tasarım ilkelerine aykırı. Aslında şuanki çzümün de bu ilkelere aykırı oluyor. Çünkü farklı bir entity türü eklemek istediğinde alakasız yerlerin kodunu değiştirmen gerekecek. Akılcılık konusuna gelince bence virtual yaparak direk entity'nin update'ini çağırmak ve gerçek türünün ne olduğuna onun karar vermesini sağlamak daha akılcı. uLtRaLoVeR tarafından 19/Kas/15 02:33 tarihinde düzenlenmiştir

Virtual methodu derived sınıfta tekrar yazdıktan sonra orjinal haline hala erişebilir miyiz?C# taki base. helloWorld gibi?Çünkü methodun içini tekrar yazmak pek uygun bir yntem gibi gelmedi. Bylece sadece eklemek istediklerimi yazarım kod fazlalığı olmaz dedim.

Entity. h içerisinde class Camera; class Entity şeklinde yap tanımlamanı. Camera. h'ı include etme. Daha sonra Camera. h içerisinde Entity. h'ı include ederek kullanmayı bir dene. There are 10 types of people in the world. Those who knows binary and those who dont...

Dediğimin tam tersini de bi deneyebilir misin? Bir de benim dediğimi yapmadan nce tam olarak ne hata veriyordu? There are 10 types of people in the world. Those who knows binary and those who dont...

Çarpraz includeler sorun çıkarır. include koruması koymalısınız ya da pragma once kullanmak lazım. Include koruması. h dosyası içine asd. h olsun #ifndef ASD_H #define ASD_H / h. dosyası içeriği... ... / #endif Bu arada player nesnesi zaten bir tane değil mi? vectorün içinde zaten referansı tutuluyor. Başka bir yerde daha bu referansı tutarsan sorun kalmaz çünkü gerçekten ulaşman gerektiğinde player'ı bulursun ve cast yapmana gerek kalmaz :) Ben olsam entityleri playerdan tamamen soyutlarım . Oyuncu nesnem, oyuncunun grebileceği tüm entityleri kendisi saklar. Olaylara karışmayın!

NmC bunu yazdı uLtRaLoVeR bunu yazdı Waze bunu yazdı Hocam aslında yapıyı bozmuyor şu an. Entity Manager dediği class içerisinde yapıyor bunu. Ve 1vsAll durumu sz konusu. Diğerlerinin tiplerini bilmesine gerek yok, sadece içlerinden bir veya birkaçı Player tipinde ise onlara ekstra bir muamelede bulunuyor :) Yeni bir entity türü Player gibi ekstra bir muamele grmeyecekse ekstra kod eklemesini gerektiren bir durum yok :) Virtual kullanmadan yapmak isterse nce entity vectorunden pointer'ları alıp sırayla player'a cast etmeyi deneyecek. Eğer cast başarılı olursa onun, olmazsa nceki halinin update fonksiyonunu çağıracak. Buraya kadar hem fikiriz sanırım. Şimdi bir de farklı bir entity ekleyelim. Stoper olsun o da. Entity manager içerisindeki bu dngünün içine bir de stoper'e cast etmeyi denemeyi eklemek zorundayız bundan bahsettim ben. Entity classının değil, entity manager'ın tüm entity türlerinden haberi olması gerekiyor bu durumda. nceki yorumda o kısmı yanlış belirtmişim. Ama bana yine de mantıksız geliyor. Entity manager olaya daha soyut bi şekilde, doğrudan entity diyerek bakmalı bence, alt sınıfını bilmeden. Hocam olayı şyle düşün. Arkadaşın rneği üzerinden gidecek olursak. Bir oyun sahnesinde game objectler var. Ve bunları tutan bir game object vectoru var. Her bir objenin yeni pozisyonunu gameobject->update üzerinden çağırırız. Fakat sahne render edilirken en son olarak sahneye bakış açımızı player gzünden yapmamız gerektiği için game objeler içerisinden player'ı bulup ona gre sahne açısını değiştirebiliriz. Bu gibi durumlarda yardımcı olacaktır bu yaklaşım. Adam player'ı update fonksiyonunu çağırmak için değil. Player'ın kordinatını almak için kullanacak sadece, yle düşünebilirsin. Fonksiyon gene virtual kalacak yani. There are 10 types of people in the world. Those who knows binary and those who dont...

NmC hocam sorunu dediğin gibi çzdüm. yle karışıklık falan da olmadı tek seferde çalışınca gzlerim yaşardı. :D Teşekkürler. for (std::vector<Entity >::iterator i = entities. begin ; i!= entities. end ; ++i) { if (Player player = dynamic_cast<Player > else } uLtRaLoVeR hocam daha akılcı bi çzüm varsa çok ğrenmek isterim.

Teşekkürler, tam da istediğim şey. Entity sınıfında bi kaç düzenleme ile yapabilirim sanırım. Sormak istediğim birşey daha var. Üstte bahsettiğim vector<Entity > entities, EntityManager sınıfında bulunuyor. Ben EntityManager'a GetPlayer diye bir method yazmak istiyorum. Bu method entities içinden tipi Player olan nesneyi dndürecek. Bunun için entities'i bir dngüyle dolaşıp tek tek tiplerini kontrol etmek istedim. Ama yine yukarıda dediğim gibi typeid ile tipini alınca Entity olarak grüyor. Bu sorunu nasıl aşabilirim? Kafayı yemek üzereyim... Player'ı entities içinden çıkarıp ayrı tanımlayarak bu sorunu aşabilirim ama bunun için de entities için yaptığım her şeyi player için de tek tek yapmam gerekiyor . Yapıcaksam biraz şık olsun derme çatma bi kod olmasın istiyorum. Var mı bir yolu? Bir çzüm daha geldi aklıma, entity içine isPlayer diye bir bool koyarım sonra onu kontrol ederim en olmadı. Caiz midir? Waze tarafından 19/Kas/15 00:50 tarihinde düzenlenmiştir

Bu gibi durumlarda interface'den kalıtım alın, aksi halde abstract bir sınıf oluşturup hepsini bundan türetin. Daha iyi bir alışkanlıktır . Olaylara karışmayın!

Waze bunu yazdı Teşekkürler, tam da istediğim şey. Entity sınıfında bi kaç düzenleme ile yapabilirim sanırım. Sormak istediğim birşey daha var. Üstte bahsettiğim vector<Entity > entities, EntityManager sınıfında bulunuyor. Ben EntityManager'a GetPlayer diye bir method yazmak istiyorum. Bu method entities içinden tipi Player olan nesneyi dndürecek. Bunun için entities'i bir dngüyle dolaşıp tek tek tiplerini kontrol etmek istedim. Ama yine yukarıda dediğim gibi typeid ile tipini alınca Entity olarak grüyor. Bu sorunu nasıl aşabilirim? Kafayı yemek üzereyim... Player'ı entities içinden çıkarıp ayrı tanımlayarak bu sorunu aşabilirim ama bunun için de entities için yaptığım her şeyi player için de tek tek yapmam gerekiyor . Yapıcaksam biraz şık olsun derme çatma bi kod olmasın istiyorum. Var mı bir yolu? Bir çzüm daha geldi aklıma, entity içine isPlayer diye bir bool koyarım sonra onu kontrol ederim en olmadı. Caiz midir? Normalde casting ile işi çzebilirsin hocam. Şuraya bi bak http://stackoverflow.com/questions/28002/regular-cast-vs-static-cast-vs-dynamic-cast Ürettiğin iki çzüm de pek caiz değil :) İlkinde kullandığın yapıyı bozuyorsun. İkincisinde sadece bir sınıf yüzünden bütün hepsine gereksiz bir fonksiyon ekleyeceksin. Bu arada include işlemlerin karışacak muhtemelen. Eğer byle birşeyle karşılaşırsan Forward declaration konusuna bakman gerekecek :) casting ile ilk problem de çzülebilirdi aslında ama object oriented yazmanın bir anlamı kalmıyor o durumda.

Teşekkürler, tam da istediğim şey. Entity sınıfında bi kaç düzenleme ile yapabilirim sanırım. Sormak istediğim birşey daha var. Üstte bahsettiğim vector<Entity > entities, EntityManager sınıfında bulunuyor. Ben EntityManager'a GetPlayer diye bir method yazmak istiyorum. Bu method entities içinden tipi Player olan nesneyi dndürecek. Bunun için entities'i bir dngüyle dolaşıp tek tek tiplerini kontrol etmek istedim. Ama yine yukarıda dediğim gibi typeid ile tipini alınca Entity olarak grüyor. Bu sorunu nasıl aşabilirim? Kafayı yemek üzereyim... Player'ı entities içinden çıkarıp ayrı tanımlayarak bu sorunu aşabilirim ama bunun için de entities için yaptığım her şeyi player için de tek tek yapmam gerekiyor . Yapıcaksam biraz şık olsun derme çatma bi kod olmasın istiyorum. Var mı bir yolu? Bir çzüm daha geldi aklıma, entity içine isPlayer diye bir bool koyarım sonra onu kontrol ederim en olmadı. Caiz midir? Normalde casting ile işi çzebilirsin hocam. Şuraya bi bak http://stackoverflow.com/questions/28002/regular-cast-vs-static-cast-vs-dynamic-cast Ürettiğin iki çzüm de pek caiz değil :) İlkinde kullandığın yapıyı bozuyorsun. İkincisinde sadece bir sınıf yüzünden bütün hepsine gereksiz bir fonksiyon ekleyeceksin. Bu arada include işlemlerin karışacak muhtemelen. Eğer byle birşeyle karşılaşırsan Forward declaration konusuna bakman gerekecek :) There are 10 types of people in the world. Those who knows binary and those who dont...

Waze bunu yazdı NmC hocam sorunu dediğin gibi çzdüm. yle karışıklık falan da olmadı tek seferde çalışınca gzlerim yaşardı. :D Teşekkürler. for (std::vector<Entity >::iterator i = entities. begin ; i!= entities. end ; ++i) { if (Player player = dynamic_cast<Player > else } uLtRaLoVeR hocam daha akılcı bi çzüm varsa çok ğrenmek isterim. Bahsettiğim şey bundan çok farklı değildi. update methodunu çağırırken cast edip çağırırsan virtual olmasına gerek kalmaz. Ama dediğim gibi entity sınıfının tüm alt sınıflarını bilmesi lazım. Bu da nesneye ynelik tasarım ilkelerine aykırı. Aslında şuanki çzümün de bu ilkelere aykırı oluyor. Çünkü farklı bir entity türü eklemek istediğinde alakasız yerlerin kodunu değiştirmen gerekecek. Akılcılık konusuna gelince bence virtual yaparak direk entity'nin update'ini çağırmak ve gerçek türünün ne olduğuna onun karar vermesini sağlamak daha akılcı. Onun için nasıl bir yol nerirsin hocam, update methodu geriye kendi tipini dndürse nasıl olur? Edit: Gerçi o da olmaz, player'ı almak istediğimde update çağırırsam çarşı karışır. Waze tarafından 19/Kas/15 04:17 tarihinde düzenlenmiştir

Waze bunu yazdı NmC hocam sorunu dediğin gibi çzdüm. yle karışıklık falan da olmadı tek seferde çalışınca gzlerim yaşardı. :D Teşekkürler. for (std::vector<Entity >::iterator i = entities. begin ; i!= entities. end ; ++i) { if (Player player = dynamic_cast<Player > else } uLtRaLoVeR hocam daha akılcı bi çzüm varsa çok ğrenmek isterim. Bahsettiğim şey bundan çok farklı değildi. update methodunu çağırırken cast edip çağırırsan virtual olmasına gerek kalmaz. Ama dediğim gibi entity sınıfının tüm alt sınıflarını bilmesi lazım. Bu da nesneye ynelik tasarım ilkelerine aykırı. Aslında şuanki çzümün de bu ilkelere aykırı oluyor. Çünkü farklı bir entity türü eklemek istediğinde alakasız yerlerin kodunu değiştirmen gerekecek. Akılcılık konusuna gelince bence virtual yaparak direk entity'nin update'ini çağırmak ve gerçek türünün ne olduğuna onun karar vermesini sağlamak daha akılcı. Hocam aslında yapıyı bozmuyor şu an. Entity Manager dediği class içerisinde yapıyor bunu. Ve 1vsAll durumu sz konusu. Diğerlerinin tiplerini bilmesine gerek yok, sadece içlerinden bir veya birkaçı Player tipinde ise onlara ekstra bir muamelede bulunuyor :) Yeni bir entity türü Player gibi ekstra bir muamele grmeyecekse ekstra kod eklemesini gerektiren bir durum yok :) There are 10 types of people in the world. Those who knows binary and those who dont...

YeniHarman hocam tam olarak NmC hocamın bahsettiği şeyi yapmaya çalışıyorum. Aslında herşeyi baştan bir anlatmak gerekirse; Ekrana basmam gereken resimleri Sprite sınıfında tutuyorum. İçinde render methodu var. EntityManager sınıfında vector<Entity > var. Adı entities. Entity sınıfında x, y, w, h gibi standart bilgiler var. Bir de Sprite nesnesi var içinde, her varlığın bir resmi olmak zorunda. Player sınıfı Entity'den miras alıyor. Extra olarak zıplama, hareket etme methodları var. Tüm Entity'ler ile beraber Player da entities listesinde tutuluyor.1 - nce Player'ın update methodunu çalıştıramıyordum, dediğiniz gibi virtual yapınca ortadan kalktı sorun.2 - Entities içinden istediğim zaman Player bilgilerine ulaşmam gerekiyordu, o da dediğiniz gibi dynamic_cast ile halloldu. Şimdi, yeni bir sorun var.1 - Bir tane Camera sınıfım var. İçinde Vector2 position bir de Uint8 zoomRatio var.2 - Entity içinde bir SDL_Rect, mutlak pozisyon ve boyut bilgilerini tutuyor. şeklinde. 3 - Greceli pozisyon ve boyutları üretmek için Entity içinde GetX, GetY, GetWidth, GetHeight fonksiyonları var. Bu fonksiyonların hepsi parametre olarak Camera alıyor.4 - GetX ve GetY fonksiyonları sırayla ve bilgilerini return ediyor.5 - GetWidth ve GetHeight sırayla ve bilgilerini return ediyor. Buraya kadar sorun yok. 1. Entity'nin Render methoduna bir Camera veriliyor.2. Bu method aynı kamerayı GetRect methoduna (ki bu az nceki 4 methodun yaptığı işi yapıyor) gnderip sonucu Sprite->Render methoduna parametre olarak veriyor.3. Son olarak Sprite->Render içinde, Sprite içindeki SDL_Texture nesnesi SDL_RenderCopyEx fonksiyonu ile ekrana basılıyor. Buraya kadar da sorun yok. Camera'yı geçiçi bir kod yazıp ok tuşlarıyla oynattığımda sorun grmedim. Sorun şu: Camera'nın Player'ı takip etmesi gerekiyor. EntityManager Update methodu içinde Player'ın pozisyonunu alıp Camera'nınkine eşitliyorum. Ama Entity render edilirken GetRect methodu ile Camera offsetlerini zaten eklemiştik. Bylece camera her player'a yaklaştığında player daha uzaklaşıyor. Derken aklıma bir fikir geldi. Entity GetAbsolutePosition diye ayrı bir fonksiyon yazdım. Sonra dnen değerin negatifini alıp camera->position'a eşitledim. Oldu. Vay be sorunu anlatayım derken kendi kendime rubber duck yaptım. :P Tekrar teşekkürler yardımlarınız için. Gider ayak bi soru daha sorayım:Entity. h içinde #include Camera. h var. Camera. h içinde Entity followingEntity tanımlamak istediğimde Entity tanımlı değil diyor. Oysa ki #include Entity. h yaptım. Byle çapraz include yapınca sorun mu oluyor?

virtual bildirimini unutmuyorsunuz değil mi? Aksi halde çalışacak metodu pointer seçer. rnek: #include <iostream> #include <vector> using namespace std; class Entity { private: int _i; private: string _name; public: virtual void Update public: virtual int GetI public: virtual void Name public: virtual string Name }; class Player: public Entity { private: int _i; private: string _name; public: void Update public: int GetI public: void Name public: string Name }; int main { std::vector <Entity > entities; Player a = new Player ; a->Name ; a->Update(4); entities. push_back ; Entity b = new Entity ; b->Name ; b->Update(3); entities. push_back ; for(int i = 0; i < entities. size ; ++i) for(int i = 0; i < entities. size ; ++i) for(int i = 0; i < entities. size ; ++i) // your code goes here return 0; } Olaylara karışmayın!

Biliyorum çok sık soru sordum ama kusura bakmayın. Normalde ilk google'a sorarım ama bu sorunu nasıl arayacağımı bilemedim... Bi tane vector var ve içinde Entity türünden nesneler var. std::vector <Entity > entities; Bir tane de yine Entity'den türeyen Player sınıfı/nesnesi var. Player player = new Player ;Add ; // entities içine ekliyor Bir dngü yardımıyla entities içindeki tüm nesneleri gezip hepsinin update methodunu çalıştırıyorum. for (size_t i = 0; i < entities. size ; i++) Normalde Player sınıfında Entity'nin Update methodunu override ettim, ama vector içine atınca Player'a Entity muamelesi yapıyor. Entity'nin Update methodunu çalıştırıyor. Dngü içinde Player'a typeid yapınca Entity alıyorum. Sebebi ne olabilir?