2016-11-27 3 views
-1

У меня ошибка. Я не знаю, как исправить мою домашнюю работу. Ошибка, которую я получаю, - «42 дублирующих символа для архитектуры x86_64». Я предполагаю, что это связано с моим глобальным файлом переменных «global.h». У меня есть 3 глобальных переменных, которые я использую, и «global.h» включен в абстрактный класс под названием «PageReplacementAlgorithm.cpp». У меня есть около 6 классов, которые получены из класса PageReplacementAlgorithm, и они используют эти глобальные переменные. Я думаю, что проблема возникает, когда я включаю все эти производные классы в мой «main.cpp», поскольку мне нужно создавать новые экземпляры. Как я могу исправить реализацию глобальных переменных?Ошибка глобальной переменной C++

Global.h

#include "PageTableEntry.h" 
using namespace std; 
#ifndef Global_H 
#define Global_H 

extern PageTableEntry pageTable[64]; 
extern int* frameTable; 
extern int framesCount; 

#endif 

PageReplacementAlgorithm.h

#include "Global.h" 
using namespace std; 

#ifndef PageReplacementAlgorithm_H 
#define PageReplacementAlgorithm_H 

class PageReplacementAlgorithm { 
public: 
    virtual int selectFrame(PageTableEntry &p) = 0; 
}; 

#endif 

Пример производный класс (FIFO)

include "PageReplacementAlgorithm.h" 
using namespace std; 

#ifndef FIFO_H 
#define FIFO_H 

class FIFO : public PageReplacementAlgorithm { 
public: 
    FIFO(); 
    int selectFrame(PageTableEntry &p); 
private: 
    int entries; 
}; 

#endif 

main.cpp

#include "Aging.cpp" 
#include "Clock.cpp" 
#include "FIFO.cpp" 
#include "MMU.cpp" 
#include "NRU.cpp" 
#include "Random.cpp" 
#include "SecondChance.cpp" 
+0

Отлично! Где ваш источник? (Включите его в вопрос). –

+0

, пожалуйста, отправьте свой исходный код ... :) – pkthapa

+0

Спасибо, только что отправил его :) – Matrix21

ответ

0

Зачем вы включаете все файлы cpp в main.cpp? Я думаю, что они содержат то же самое, верно? Даже у вас есть охранники, перед вами есть дополнительные принадлежности, и это, вероятно, является источником проблем. Main.cpp может содержать только функцию main() и импортировать заголовки ваших классов, нет необходимости включать cpp.

Кроме того, вы можете изменять файлы заголовков, чтобы посмотреть, как это (ради крайней безопасности):

#ifndef PageReplacementAlgorithm_H 
#define PageReplacementAlgorithm_H 
#include "Global.h" 
using namespace std; 

... 
#endif 

Я рекомендую вам взглянуть на ответ C++ #include guards

+1

Это старая техника, называемая (уникально) ['Single Compilation Unit'] (https://en.wikipedia.org/wiki/Single_Compilation_Unit) – StoryTeller

+0

Спасибо! Теперь он компилируется, я также буду читать «Единую компиляционную единицу», а также @StoryTeller. Еще новичок в C++. – Matrix21

+2

@StoryTeller Brilliant. Никогда не слышал об этом раньше!Matrix21 вы, вероятно, лучше придерживаетесь более нормальных способов создания кода, хотя –

0

Если вы избавитесь от #include "(anything).cpp, вещи должны работать намного лучше. Когда вы строите проект или запускаете компилятор, например. g++ main.cpp foo.cpp, вот когда файлы .cpp будут созданы и подключены к вашей программе.