2016-08-14 4 views
2

Я пытаюсь создать простую программу, которая принимает входные данные от пользователя на C++, используя хорошие методы программирования. Он состоит из Input.hpp, Input.cpp и main.cpp. Я продолжаю получать множественную ошибку определения, хотя я использую ifndef для предотвращения этого.Объявление переменных в заголовочных файлах C++

Input.hpp

#ifndef Input_HPP 
#define Input_HPP 

#include <string> 
#include <vector> 
using namespace std; 

vector<string> Get_Input(); 
vector<string> input_array; 
string starting_position; 
int input_number; 

#endif 

Input.cpp

#include <iostream> 
#include <cmath> 
#include <string> 
#include <vector> 

#include "Input.hpp" 

using namespace std; 

vector<string> Get_Input() 
{ 
    cin>>starting_position; 
    cin>>input_number; 
    for (int i = 0; i < input_number; i++) 
    { 
     cin>>input_array[i]; 
    } 
    cout<<"Done"; 

    return input_array; 
} 

main.cpp

#include "Input.hpp" 
#include <iostream> 
using namespace std; 

int main() 
{ 

    Get_Input(); 
    return 0; 
} 

Когда я удалить объявления переменных из файла заголовка и поместить их в CPP файл, но сохраните объявление функции в файле заголовка, который программа создает без ошибок. Я понимаю, что переменные и функции могут быть объявлены в файлах заголовков. Может кто-нибудь, пожалуйста, объясните мне, что мне не хватает?

спасибо.

ответ

3

Файл заголовка не так уж и умный, он просто сообщает препроцессору взять весь заголовок и поместить его вместо строки include.

Если вы это сделаете, вы увидите, что переменная объявлена ​​дважды.

Чтобы решить эту проблему, вы должны объявить переменные в одном из ваших файлов cpp и использовать extern в заголовках.

как в input.cpp:

int input_number; 

и input.hpp:

extern int input_number; 
+0

«Экстерн» - это то, что я искал. Спасибо за простой пример! – ChrisCantrell

0

включаемого караул только предотвратить копирование включаемого файла, если он уже был скопирован, который работает правильно в вашем кода, и компилятор может скомпилировать код успешно. Теперь, когда вы получаете ошибку компоновщика, после того, как ваш компилятор сгенерировал объектные файлы для и main.cpp, он найдет два символа - переменные - с тем же именем и начнет жаловаться, какой из них я должен использовать?

Так что, если вы указали переменную в файле заголовка, добавьте ключевое слово extern, чтобы сохранить компоновщик счастливым.

Смежные вопросы