crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Предварительное объявление класса
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


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


Ну и что с этим указателем дальше делать?:) Проверить на ноль и успокоиться?:)
Влад Дата 20.8.2012, 13:11
 
Цитата(wiz29 @ 17.8.2012, 17:49) *
В вашем случае такой вариант не прокатит, т.к. в публичном интерфейсе вы возвращаете объект, который не собираетесь поставлять. Необходимо экспортировать класс Object и его заголовок тоже таскать.

Вот тут есть нюанс: если в публичном интерфейсе функция должна возвращать не объект, а только лишь указатель на него, то forward declarartion как раз и позволит "развязать" заголовки. Другое дело, что, даже имея указатель, но не имея описания самого класса, - нельзя будет обратиться к членам этого класса (дернуть там метод, или обратиться к полю...). Вот тут - придется всяко включать заголовок этого класса.
Snake174 Дата 20.8.2012, 4:21
  Спасибо всем за разъяснения.
Iron Bug Дата 17.8.2012, 20:09
  если интерфейс библиотеки работает с классом, то без объявления этого класса компилятор с ним работать не сможет. ему нужно как-то генерить информацию об объекте. так что описание класса всегда должно присутствовать в заголовочниках.
wiz29 Дата 17.8.2012, 16:49
  В вашем случае такой вариант не прокатит, т.к. в публичном интерфейсе вы возвращаете объект, который не собираетесь поставлять. Необходимо экспортировать класс Object и его заголовок тоже таскать.

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

extern EXPORT Object pObject;
Влад Дата 17.8.2012, 15:49
  Используй 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
Snake174 Дата 17.8.2012, 15:01
  Всем привет.
Ситуация такая: пишу динамическую библиотеку. Нужно чтобы в конечном итоге получилось 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.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 23:47