Я пытаюсь создать общую библиотеку для использования в некоторых своих проектах. Идея состоит в том, чтобы объединить все классы, которые я использую для общей роли (в данном случае файлового ввода-вывода), с помощью 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
Есть ли способ создать объекты другого типа, но одинаковые базовые объекты наследования, определенные в общей библиотеке ⇐ C++
Программы на C++. Форум разработчиков
1731725017
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
Ошибка множественных определений говорит о том, что здесь впервые были определены функции создания и уничтожения. [b]Я пытался объявить эти функции вне класса BaseFile как автономные функции, но ошибка осталась та же.[/b]
Файлы реализации содержат #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))
Подробнее здесь: [url]https://stackoverflow.com/questions/55944855/is-there-a-way-to-create-different-type-but-same-base-inheritance-objects-define[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия