Декларація класу C ++ Extern

Редагувати: Гаразд, я написав трохи тестової програми, щоб показати тут. Ось вихідний код.

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

У цій програмі тесту я отримую таку помилку: window.h (10): помилка C2065: 'core': недекларований ідентифікатор . Я сподіваюся, що це трохи пояснює мою проблему. Будь ласка, проігноруйте, що ці функції не мають сенсу його просто для показу того, що я зробив, тому що мій оригінальний код є способом довго розміщувати тут.

3
Компілятор скаржиться на конструктора. Чи є у вас конструктор за замовчуванням як частина класу Core, якщо ви перевантажили конструктор?
додано Автор Mahesh, джерело
Привіт, @user. Ласкаво просимо до переповнення стека. Хоча хтось може знати відповідь на ваше запитання під час подання, шанси покращиться, якщо вставити повну , мінімальну програму. Повне означає, що ми можемо завантажити його і скомпілювати, щоб побачити помилку компілятора. Мінімальний означає, що це найменша програма, яка все ще демонструє помилку. Крім того, при створенні такої програми, ви дуже добре можете знайти помилку самостійно! Докладніше див. У розділі sscce.org .
додано Автор Robᵩ, джерело

3 Відповіді

Ви включаєте заголовок window.h перед лінією " extern Core core; ". Спробуйте додати цей рядок безпосередньо перед рядком Window у заголовку window.h :

window.h

#ifndef WINDOW_H__
#define WINDOW_H__

extern Core core;

class Window
{...}

Замість використання Core як глобальної змінної, ви можете перемістити core як статичний член класу Core . Це називається шаблоном Singleton .

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
додано
@ vz0: невизначений тип "Core :: Core" Помилка не буде виправлена ​​нічим, що бачу тут.
додано Автор Mooing Duck, джерело
Ну, він пояснив повідомлення про помилку, і тепер я бачу (реальну) проблему, яку ви вирішили. Не відчуваю себе нерозумно.
додано Автор Mooing Duck, джерело
Більшість лінкерів все одно може вбудовувати його. Не турбуйтеся про це.
додано Автор Mooing Duck, джерело
Відповідь оновлено.
додано Автор vz0, джерело
@DipankarSaha вам не вистачає Core Core :: coreInstance; у файлі .cpp
додано Автор vz0, джерело
Привіт і дякую за відповіді. Якщо я поклав мій implemntation в cpp файл хворий є проблема, що мої функції є вбудованими, і я не можу вбудувати мої функції в окремий файл CPP.
додано Автор roohan, джерело
Ей vz0 ... Добре переміщення функції до файлу window.cpp не виправити це самостійно. Після прочитання вашого оновлення я побачив, що ви включили основний заголовок у файл window.cpp і тепер він працює. Велике спасибі! Єдина проблема в тому, що я не можу використовувати цю функцію вбудованої зараз ...
додано Автор roohan, джерело
Я отримую невизначену посилання на Core :: coreInstance . Будь-яка ідея причина?
додано Автор Dipankar Saha, джерело

Або ви забули визначити конструктор за промовчанням ядра, або ядро ​​не може бути тривіально побудованим за замовчуванням (через наявність бази або члена, який не має конструктора за замовчуванням.

До основного додайте:

class Core {
    Window window;

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

До вікна додайте:

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

Якщо не вдасться скомпілювати, вам доведеться трохи покласти проблему

EDIT:

Ну тепер, коли повідомлення про помилку було уточнено, я бачу помилку одразу. Window.h вимагає визначення Core core , а для визначення Core.h потрібно Window . Рішення мусить зробити як vz0 запропонував з приїжджають ідуть. Перемістіть визначення Window :: someFunction до window.cpp (і я відчуваю необхідність піти на вибачення для vz0)

0
додано
Чи є C2027: використання невизначеного типу 'Core :: Core' (верхній регістр) фактичне повідомлення про помилку? або це C2027: використання невизначеного типу 'Core :: core' (нижній регістр)? або C2027: використання невизначеного типу 'Core' (noscope)? Я вважав першим, оскільки це те, що ви написали, але визначення конструкторів повинно було виправити це.
додано Автор Mooing Duck, джерело
Відповідно до msdn.microsoft.com/en-us /library/6c2dk0ah(v=vs.80).aspx , у котируваннях у помилці має бути тип. Ви перерахували функцію. Це дійсно повідомлення про помилку?
додано Автор Mooing Duck, джерело
Привіт, у мене немає конструктора за замовчуванням ще. Але додавання їх не вирішило моєї проблеми. Я все ще отримую помилку, що ядро ​​не оголошено в класі Window.
додано Автор roohan, джерело
Привіт, я відредагував свій перший пост, щоб прояснити мою проблему трохи я сподіваюся, що це допомагає.
додано Автор roohan, джерело
Коли я переміщую визначення функції до cpp файлу "Core", все одно не знаю. Якщо я спробую initilize Core як вказівник, компілятор все ще скаржиться, що він не знає Core Datatype у файлі заголовка вікна.
додано Автор roohan, джерело

Я думаю, що я знайшов вашу проблему. У файлі заголовка визначення клас "Core" оголошується як "ядро". Пам'ятайте, що шапки мають велике значення.

0
додано
Вибачте, моя помилка я відредагував свою публікацію. Чутливість справи не є проблемою :)
додано Автор roohan, джерело
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147