Есть ли способ создать объекты другого типа, но одинаковые базовые объекты наследования, определенные в общей библиотекеC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли способ создать объекты другого типа, но одинаковые базовые объекты наследования, определенные в общей библиотеке

Сообщение Anonymous »

Я пытаюсь создать общую библиотеку для использования в некоторых своих проектах. Идея состоит в том, чтобы объединить все классы, которые я использую для общей роли (в данном случае файлового ввода-вывода), с помощью API и создать экземпляры производных классов, адаптированные для конкретных задач. Проблема в том, что я не могу создавать разные экземпляры из разных производных классов. Компилятор выдает ошибки «множественное определение BaseFile::create(FileObjectType)» и «множественное определение BaseFile::destroy(BaseFile*)»

Я работаю с Linux и Код::Блоки. Я создал заголовочный файл, в котором есть API (базовый класс, от которого наследуются все остальные) и две функции: одна для создания и возврата экземпляра, а другая для его уничтожения. Во втором заголовочном файле я храню объявления классов и реализацию функций-членов создания и уничтожения, а также несколько файлов, в которых я реализую каждый класс.

//This is the API header file
#ifndef FILELIB_HPP_INCLUDED
#define FILELIB_HPP_INCLUDED
#include
#include
using namespace std;
//The different classes available, that inherit the base class
enum FileObjectType {
FOT_OUTFILE, FOT_OUTFILEB, FOT_INFILE, FOT_INFILEB
};
//The base class
class BaseFile {
protected:
string sFileName;
int iSize;
fstream FileStream;
public:
virtual bool bOpenFile(string FileName);
virtual string sReturnBlock(int IndexNumber, int BlockSize);
virtual bool bAppendBlock(string BlockToWrite);
virtual bool bCreateFile(string FileName);
virtual void vCloseFile();
//The two functions that return
static BaseFile* create(FileObjectType);
static void destroy(BaseFile* prt);
BaseFile() {};
virtual ~BaseFile();
};
//The two functions to be exported
extern "C" BaseFile* create(FileObjectType eType);
extern "C" void destroy(BaseFile* ptr);

#endif // FILELIB_HPP_INCLUDED


Основной заголовочный файл, в котором я храню объявления:

//The header file where I keep the declarations
#ifndef MAINHEADER_HPP_INCLUDED
#define MAINHEADER_HPP_INCLUDED
#include "FileLib.hpp"
#include
//Each specialised class declarations
class OutFile : public BaseFile {
private:
public:
OutFile();
~OutFile();
};
class OutFileb : public BaseFile {
private:
public:
OutFileb();
~OutFileb();
};
class InFileb : public BaseFile {
private:
public:
InFileb();
~InFileb();
};
class InFile : public BaseFile {
private:
public:
InFile();
~InFile();
};
//The two functions-to-be-exported implementation
BaseFile* BaseFile::create(FileObjectType eType)
{
if (eType == FOT_OUTFILE) return new OutFile;
if (eType == FOT_OUTFILEB) return new OutFileb;
if (eType == FOT_INFILE) return new InFile;
if (eType == FOT_INFILEB) return new InFileb;
return NULL;
}
void BaseFile::destroy(BaseFile* ptr)
{
delete ptr;
return;
}
#endif // MAINHEADER_HPP_INCLUDED


Ошибка множественных определений говорит о том, что здесь впервые были определены функции создания и уничтожения. Я пытался объявить эти функции вне класса BaseFile как автономные функции, но ошибка осталась та же.

Файлы реализации содержат #include для основного заголовочного файла, пустых реализаций конструкторов и деструкторов производных классов и ничего больше. Я попытался реализовать фабричный метод. Спасибо, что уделили время.

Редактировать: Точные ошибки компилятора: (Извините, но сайт текстового дампа не работает, поэтому я тоже скину его сюда) https ://pastebin.com/ZGXNBQhW

-------------- Build: Debug in FileLib (compiler: GNU GCC Compiler)---------------

g++ -shared -L/usr/lib/i386-linux-gnu obj/Debug/InFile.o obj/Debug/InFileb.o obj/Debug/main.o obj/Debug/OutFileb.o -o bin/Debug/libFileLib.so
obj/Debug/InFileb.o: In function `OutFile::~OutFile()':
/home/myuser/Projects/FileLib/MainHeader.hpp:42: multiple definition of `BaseFile::create(FileObjectType)'
obj/Debug/InFile.o:/home/myuser/Projects/FileLib/MainHeader.hpp:42: first defined here
obj/Debug/InFileb.o: In function `BaseFile::destroy(BaseFile*)':
/home/myuser/Projects/FileLib/MainHeader.hpp:50: multiple definition of `BaseFile::destroy(BaseFile*)'
obj/Debug/InFile.o:/home/myuser/Projects/FileLib/MainHeader.hpp:50: first defined here
obj/Debug/main.o: In function `OutFile::~OutFile()':
/home/myuser/Projects/FileLib/MainHeader.hpp:42: multiple definition of `BaseFile::create(FileObjectType)'
obj/Debug/InFile.o:/home/myuser/Projects/FileLib/MainHeader.hpp:42: first defined here
obj/Debug/main.o: In function `BaseFile::destroy(BaseFile*)':
/home/myuser/Projects/FileLib/MainHeader.hpp:50: multiple definition of `BaseFile::destroy(BaseFile*)'
obj/Debug/InFile.o:/home/myuser/Projects/FileLib/MainHeader.hpp:50: first defined here
obj/Debug/OutFileb.o: In function `OutFile::~OutFile()':
/home/myuser/Projects/FileLib/MainHeader.hpp:42: multiple definition of `BaseFile::create(FileObjectType)'
obj/Debug/InFile.o:/home/myuser/Projects/FileLib/MainHeader.hpp:42: first defined here
obj/Debug/OutFileb.o: In function `BaseFile::destroy(BaseFile*)':
/home/myuser/Projects/FileLib/MainHeader.hpp:50: multiple definition of `BaseFile::destroy(BaseFile*)'
obj/Debug/InFile.o:/home/myuser/Projects/FileLib/MainHeader.hpp:50: first defined here
collect2: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
12 error(s), 0 warning(s) (0 minute(s), 0 second(s))


Подробнее здесь: https://stackoverflow.com/questions/559 ... cts-define
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»