C ++ Dış Sınıf Bildirgesi

Düzenleme: Tamam Burada göstermek için küçük bir test programı yazdım. İşte Kaynak Kodu.

main.cpp:

#include "core.h"

Core core;

int main()
{
  core.coreFunction();
}

core.h:

#ifndef CORE_H__
#define CORE_H__

#include "definitions.h"
#include "window.h"

class Core
{
public:
  Window window;
  void coreFunction()
  {
    window.windowFunction();
  }
};
extern Core core;

#endif

definitions.h

#ifndef DEFINITIONS_H__
#define DEFINITIONS_H__

class Core;
class Window;

#endif

window.h

#ifndef WINDOW_H__
#define WINDOW_H__

class Window
{
public:

   void windowFunction()
   {
     core.coreFunction();
   }
};

#endif

Bu Sınama Programı ile aşağıdaki hatayı alıyorum: window.h (10): C2065 hatası: 'core': bildirilmemiş tanımlayıcı . Umarım bu benim problemimi biraz açıklığa kavuşturur. Lütfen, bu işlevlerin sadece ne yaptığımı göstermek için bir anlam ifade etmediğini dikkate alınız çünkü orijinal kodum burada yayınlamanın uzun bir yoludur.

3
Derleyici yapıcı hakkında şikayet ediyor. Kurucuyu aşırı yüklediyseniz, Core sınıfının bir parçası olarak varsayılan kurucu var mı?
katma yazar Mahesh, kaynak
Merhaba @user Yığın Taşması'na Hoş Geldiniz. Birisi, sorunuza yanıt olarak sorunuzu yanıtlayabilirken, eksiksiz , minimum programı yapıştırırsanız olasılıklar artar. Tamamla, onu indirip derleyici hatasını kendimiz görmek için derleyebileceğimiz anlamına gelir. Minimal, hatayı hala gösteren en küçük program anlamına gelir. Ayrıca, böyle bir program oluştururken, hatayı kendiniz bulabilirsin! Daha fazla bilgi için sscce.org adresine bakın.
katma yazar Robᵩ, kaynak

3 cevap

" extern Core core; " satırından önce window.h başlığını ekliyorsunuz. window.h başlığındaki class Window satırından hemen önce bu satırı eklemeyi deneyin:

window.h

#ifndef WINDOW_H__
#define WINDOW_H__

extern Core core;

class Window
{...}

Çekirdek bir global değişken olarak kullanmak yerine core öğesini Core sınıfının statik bir üyesi olarak taşıyabilirsiniz. Buna Singleton kalıbı denir.

main.cpp

#include "core.h"

int main()
{
  Core* core = Core::getInstance();

  core->coreFunction();
}

core.h

#include "window.h"

class Core
{
public:
  static Core* getInstance() { return &coreInstance; }
  void someFunction();

private:
  static Core coreInstance;
  Window window;
};

core.cpp

#include "core.h"

Core Core::coreInstance;

void Core::someFunction()
{
  window.doSomething();
}

window.h

class Window
{
  void someFunction();
};

window.cpp

#include "window.h"
#include "core.h"

void Window::someFunction()
{
  Core* core = Core::getInstance();

  core->doSomething();
}
8
katma
@ vz0: undefined type 'Core :: Core' hatası, burada gördüğüm herhangi bir şey tarafından düzeltilmeyecek.
katma yazar Mooing Duck, kaynak
Eh, o hata mesajını açıkladı, ve şimdi, sizin (gerçek) ele aldığınız sorunu görüyorum. Kendimi aptal hissetmiyorum.
katma yazar Mooing Duck, kaynak
Çoğu bağlayıcı, yine de satır içi olabilir. Endişelenme.
katma yazar Mooing Duck, kaynak
Cevap güncellendi.
katma yazar vz0, kaynak
@DipankarSaha, Çekirdek Çekirdek :: çekirdekInstance eksik; .cpp dosyasında
katma yazar vz0, kaynak
Merhaba, cevaplar için teşekkürler. Uygulamamı bir ccp dosyasına koyarsam, işlevlerimin satır içi olması sorunuyla karşılaştım ve ayrı bir cpp dosyasındaki işlevlerimi satır içi olarak yapıyorum.
katma yazar roohan, kaynak
Hey vz0 ... Fonksiyonu bir window.cpp dosyasına taşıyabilmek için tek başına düzeltmedim. Güncellemenizi okuduktan sonra, window.cpp dosyasında çekirdek başlığını eklediğinizi gördüm ve şimdi çalışıyor. Çok teşekkür ederim! Tek sorun şu ki bu işlevi şu an satır içi kullanamıyorum ...
katma yazar roohan, kaynak
Core :: coreInstance için tanımlanmamış referans alıyorum. Sebep fikrin var mı?
katma yazar Dipankar Saha, kaynak

Ya çekirdeğin varsayılan yapıcısını tanımlamayı unuttun ya da çekirdek varsayılan olarak varsayılan olarak yapılamıyor (varsayılan yapıcı olmayan bir taban veya üyeye sahip olmasından dolayı).

Çekirdek için şunu ekleyin:

class Core {
    Window window;

    Core() {} //add this line
    void someFunction()
    {
        window.doSomething();
    }
}

Pencereye ekle:

class Window
{
    Window() {} //add this line
    void someFunction()
    {
        core.doSomething();
    }
}

Ya derleme başarısız olursa, sorunu biraz daha sabitlemiş olacaksınız.

DÜZENLE:

Şimdi hata mesajı açıklığa kavuştu, hatayı hemen görüyorum. Window.h , tanımlanacak Çekirdek çekirdek gerektirir ve Core.h , Window öğesinin tanımlanmasını gerektirir. Çözüm, gitmeden önerilen vz0 olarak yapmaktır. Window :: someFunction tanımını window.cpp olarak değiştirin (ve vz0'dan özür dilemeye ihtiyacım olduğunu hissediyorum)

0
katma
C2027: tanımsız tür 'Çekirdek :: Çekirdek' (büyük harf) gerçek hata mesajının kullanımı mı? ya da C2027: tanımsız tip 'Core :: core' (küçük harf) kullanımı mı? veya C2027: tanımlanmamış "Çekirdek" türünün kullanımı (noskop)? İlk yazmıştım, yazdığın buydu, ama kurucuları tanımlamak bunu düzeltmeliydi.
katma yazar Mooing Duck, kaynak
msdn.microsoft.com/en-us adresine göre /library/6c2dk0ah(v=vs.80).aspx , hatanın içindeki alıntıdaki bir şey tür olmalı. Bir işlevi listeledin. Bu gerçekten hata mesajı mı?
katma yazar Mooing Duck, kaynak
Merhaba, henüz bir varsayılan Oluşturucu yok. Ama onları eklemek benim problemimi çözmedi. Hala Windows sınıfında çekirdek eksik bildirilir hatası alıyorum.
katma yazar roohan, kaynak
Merhaba, ilk yazımı, sorunumu biraz açıklığa kavuşturmak için düzenledim, umarım yardımcı olur.
katma yazar roohan, kaynak
İşlev tanımını bir cpp dosyasına taşıdığımda "Core" hala bilinmemektedir. Core'u bir işaretçi olarak başlatmaya çalışırsam, derleyici hala Windows başlık dosyasındaki Core Datatype'ı bilmediğinden şikâyet eder.
katma yazar roohan, kaynak

Sanırım sorununu buldum. Tanım başlık dosyasında "Çekirdek" sınıfı "çekirdek" olarak beyan edilir. Unutmayın, büyük bir fark yaratır.

0
katma
Üzgünüm, benim hatam Mesajımı düzenledim. Büyük/Küçük Harfe Duyarlılık Sorunu değil :)
katma yazar roohan, kaynak