Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Предварительное объявление класса
Форум на CrossPlatform.RU > Разработка > С\С++
Snake174
Всем привет.
Ситуация такая: пишу динамическую библиотеку. Нужно чтобы в конечном итоге получилось 2 файла (сама библиотека и заголовочный файл с объявлением функций).

Заголовочный файл:
#ifndef HEADER_H
#define HEADER_H

#ifdef WIN32
  #include <windows.h>
  #define EXPORT __declspec(dllexport)
#else
  #define EXPORT __attribute__((visibility("default")))
#endif

EXPORT Object *GetObject();

#endif // HEADER_H


Исходник:
#include "header.h"
#include "object.h"

#ifdef WIN32
BOOL WINAPI DllMain( HINSTANCE /*hinstDLL*/, DWORD /*fdwReason*/, LPVOID /*lpvReserved*/ )
{
  return TRUE;
}
#endif

Object *GetObject()
{
  return pObject.GetObject();
}


object.h
class Object
{
  public:
    Object();
    Object *GetObject();
};

extern Object pObject;


object.cpp
Object::Object
{
}

Object *Object::GetObject()
{
  Object *obj = new Object();
  return obj;
}

Object pObject;


Вопрос такой: можно как-нибудь в файле header.h указать тип Object без включения в него object.h? Не хотелось бы таскать вместе с библиотекой эти файлы.
Если в header.h прописать class Object, то при вызове в программе, к которой линкуется данная библиотека, выходит ошибка forward declaration и uninizialized struct Object.
Влад
Используй forward declaration:
#ifndef HEADER_H
#define HEADER_H

#ifdef WIN32
  #include <windows.h>
  #define EXPORT __declspec(dllexport)
#else
  #define EXPORT __attribute__((visibility("default")))
#endif

class Object;

EXPORT Object *GetObject();

#endif // HEADER_H
wiz29
В вашем случае такой вариант не прокатит, т.к. в публичном интерфейсе вы возвращаете объект, который не собираетесь поставлять. Необходимо экспортировать класс Object и его заголовок тоже таскать.

примерно так:
class EXPORT Object
{
  public:
    Object();
    Object *GetObject();
};

extern EXPORT Object pObject;
Iron Bug
если интерфейс библиотеки работает с классом, то без объявления этого класса компилятор с ним работать не сможет. ему нужно как-то генерить информацию об объекте. так что описание класса всегда должно присутствовать в заголовочниках.
Snake174
Спасибо всем за разъяснения.
Влад
Цитата(wiz29 @ 17.8.2012, 17:49) *
В вашем случае такой вариант не прокатит, т.к. в публичном интерфейсе вы возвращаете объект, который не собираетесь поставлять. Необходимо экспортировать класс Object и его заголовок тоже таскать.

Вот тут есть нюанс: если в публичном интерфейсе функция должна возвращать не объект, а только лишь указатель на него, то forward declarartion как раз и позволит "развязать" заголовки. Другое дело, что, даже имея указатель, но не имея описания самого класса, - нельзя будет обратиться к членам этого класса (дернуть там метод, или обратиться к полю...). Вот тут - придется всяко включать заголовок этого класса.
wiz29
Цитата(Влад @ 20.8.2012, 14:11) *
Вот тут есть нюанс: если в публичном интерфейсе функция должна возвращать не объект, а только лишь указатель на него, то forward declarartion как раз и позволит "развязать" заголовки.


Ну и что с этим указателем дальше делать?:) Проверить на ноль и успокоиться?:)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.