C ++ Extern Class deklaratsiyasi

Tartibga solish: OK bu erda ko'rsatiladigan kichik test dasturini yozdim. Manba kodi bu erda.

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

Ushbu sinov dasturida quyidagi xato yuzaga keladi: window.h (10): xato C2065: «yadrosi: noma'lum identifikator ." Umid qilamanki, bu mening muammomni biroz tushuntiradi. Iltimos, ushbu funktsiyalarni bajargan narsalarimni ko'rsatish uchun hech qanday ahamiyatga ega emasligini inkor qilmang, chunki original kodim bu erda chop etish uchun uzoq vaqtdir.

3
Compiler konstruktordan shikoyat qilmoqda. Konstruktorni haddan tashqari yüklediyseniz, Core sinfining bir qismi sifatida standart konstruktoringiz bormi?
qo'shib qo'ydi muallif Mahesh, manba
Salom, @user. Stack Overflowga xush kelibsiz. Sizning savolingizga javobingizni kimdir bilishi mumkin bo'lsa-da, to'liq , minimal dasturini joylashtirasiz. To'liq biz uni yuklab olishimiz va kompilyator xatolarini o'zimiz ko'rish uchun kompilyatsiya qilishimiz mumkin degan ma'noni anglatadi. Minimal, bu xatoni ko'rsatadigan eng kichik dastur demakdir. Bundan tashqari, bunday dasturni yaratishda xatoni o'zingiz ham yaxshi bilasiz! Qo'shimcha ma'lumot uchun sscce.org ga qarang.
qo'shib qo'ydi muallif Robᵩ, manba

3 javoblar

Siz window.h sarlavhasini " extern core core" "qatoridan oldinroq kiritasiz. window.h sarlavhasi ustidagi class Window qatoridan oldin bu qatorni qo'shib ko'ring:

window.h tugmasini bosing

#ifndef WINDOW_H__
#define WINDOW_H__

extern Core core;

class Window
{...}

Core-ni global o'zgaruvchan sifatida ishlatish o'rniga core -ni Core sinfining statik a'zosi sifatida ko'chirishingiz mumkin. Bunga Singleton naqsh deb ataladi.

main.cpp

#include "core.h"

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

  core->coreFunction();
}

core.h -ni tanlang

#include "window.h"

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

private:
  static Core coreInstance;
  Window window;
};

core.cpp -ni tanlang

#include "core.h"

Core Core::coreInstance;

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

window.h tugmasini bosing

class Window
{
  void someFunction();
};

window.cpp -ni tanlang

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

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

  core->doSomething();
}
8
qo'shib qo'ydi
@ vz0: Belgilangan bo'lmagan 'Core :: Core' xatosi bu erda chop etilgan narsalar bo'yicha tuzatilmaydi.
qo'shib qo'ydi muallif Mooing Duck, manba
Xo'sh, u xato xulosasini aniqladi, endi siz ko'rib chiqqan (haqiqiy) muammo. O'zimni aqlsiz deb his qilmayman.
qo'shib qo'ydi muallif Mooing Duck, manba
Aksariyat ishtirokchilar uni barchasini inline qilishlari mumkin. Xavotir olmang.
qo'shib qo'ydi muallif Mooing Duck, manba
Javob yangilandi.
qo'shib qo'ydi muallif vz0, manba
@DipankarSaha; Core Core :: mainInstance; .cpp faylida
qo'shib qo'ydi muallif vz0, manba
Salom, javoblaringiz uchun tashakkur. Agar mening implemntatsiyamni ccp fayliga qo'ygan bo'lsam, unda mening funktsiyalarim inline bo'lib, mening funktsiyalarimni alohida cpp faylida inline qila olmayman.
qo'shib qo'ydi muallif roohan, manba
Hey vz0 ... Ok funktsiyani window.cpp faylga ko'chirib olib, uni tuzatmadi. Yangilanishingizni o'qib bo'lgach, siz window.cpp faylidagi yadro sarlavhasini o'z ichiga olganligini ko'rdim va endi u ishlaydi. Katta rahmat! Muammo shundaki, endi bu funktsiyani inline ishlata olmayman ...
qo'shib qo'ydi muallif roohan, manba
Core :: coreInstance uchun undefined mos yozuvlar olaman. Har qanday fikr nima uchun?
qo'shib qo'ydi muallif Dipankar Saha, manba

Yoki siz yadroning standart konstruktorini aniqlashni unutdingiz, yoki yadro asl qiymati bilan qurilgan bo'lishi mumkin emas (asl holatda asoschi yoki a'zo bo'lmaganligi tufayli).

Asosiy uchun, quyidagilarni qo'shing:

class Core {
    Window window;

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

Oynaga:

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

Agar siz yoki kompilyatsiya qila olmasangiz, siz bu muammoni biroz ko'proq qisqartirdingiz

EDIT:

Xo'sh, endi xato xabari aniq-ravshan bo'lib chiqdi, men xatolarni aniq ko'rib turibman. Window.h kodini aniqlash uchun Core core kerak va kodni aniqlash uchun Core.h kerak Window . Qaror qabul qilishdan taklif qilingan vz0 ni bajarishdir. Window :: someFunction ning ta'rifini window.cpp ga ko'chiring (va men vz0 uchun uzr so'rash kerakligini his qilaman)

0
qo'shib qo'ydi
C2027: haqiqiy xato xabari aniqlanmagan turdagi 'Core :: Core' (katta harf) ishlatilsinmi? yoki C2027: undefined turi 'Core :: core' (kichkina) dan foydalanishmi? yoki C2027: belgilanmagan turdagi 'Core' (noskop) dan foydalanish kerakmi? Men siz yozganingizdan buyon ilk bor gaplashdim, lekin konstruktorlarni belgilab qo'yish kerak edi.
qo'shib qo'ydi muallif Mooing Duck, manba
msdn.microsoft.com/en-us /library/6c2dk0ah(v=vs.80).aspx da, xatoliklar tirnoqidagi narsalar turi bo'lishi kerak. Siz funktsiyani rostladingiz. Bu, albatta, xato xabari bormi?
qo'shib qo'ydi muallif Mooing Duck, manba
Salom, men hali bir sukut quruvchi yo'q edim. Lekin ularni qo'shib qo'yish mening muammomni hal qilmadi. Hali ham yadro yadro oynasida noma'lum xatolikka duch kelaman.
qo'shib qo'ydi muallif roohan, manba
Salom, mening birinchi xatimni tahrir qilib, muammomni ochib berishga yordam berdi.
qo'shib qo'ydi muallif roohan, manba
Funktsiyaning ta'rifini cpp fayliga ko'chirsam, "Core" hali ham unkown. Agar Core-ni ko'rsatgich sifatida ishga tushirishga harakat qilsam, derleyici hali ham deraza oynasi faylida Core Datatypeni bilmasligini shikoyat qiladi.
qo'shib qo'ydi muallif roohan, manba

Sizning muammoingizni topdim deb o'ylayman. Belgilangan nom faylida "Core" klassi "yadro" deb e'lon qilinadi. Esingizda bo'lsa, qopqoqlar katta farq qiladi.

0
qo'shib qo'ydi
Kechirasiz, men xatimni xatni tahrirladim. Ishning sezgirligi noto'g'ri :)
qo'shib qo'ydi muallif roohan, manba