2013-09-04 5 views
0

Ok файл, так что я довольно новыми для C++, у меня есть несколько вопросов о заголовочных файлах ...Заголовок C++ Взаимодействие

1.) Какие переменные вы должны декларировать, и которые должны вы не в заголовке файл?

2.) Когда вы объявляете переменную в файле заголовка, следует ли использовать extern?

Вот мой файл заголовка:

#ifndef MAIN_H 
#define MAIN_H 

class Main 
{ 
public: 
     int main(); //Constructor 
     virtual ~Main(); //Destructor 

     double initialVelocity; 
     double initialAngle; 

private: 
     double degToRad(double angle); 
     void simulate(double angle, double velocity); 
}; 
#endif 

А вот мой main.cpp

/******************************************************************* 
* This program will take input for initial velocity (fps), and a launch angle 
* based on this information, the current posotion of the object thrown will be 
* calculated until it hits the ground. 
* 
* 
* Date: 30 August 2013 
* Version 1.0 
* 
**/ 

# include "Main.h" 
# include <iostream> 
# include <fstream> 
# include <cmath> 
using namespace std; 

/****************************************************************** 
* General Variables 
**/ 
const int GRAVITY_FACTOR = -16; 
const int GROUND = 0; 
const double PI = atan(1.0)*4; 
double initialVelocity; 
double initialAngle; 

/****************************************************************** 
* degToRad function. 
* 
* This function takes in an angle in degrees, and converts it to 
* radians. 
* 
**/ 
double degToRad(double angle){ 
    return angle * (PI/180); 
    } 

/****************************************************************** 
* simulate function. 
* 
* Takes in the angle in radians, and the velocity. Calculates the 
* path of the projectile, and displays it in the terminal. 
* 
**/ 
void simulate(double angle, double velocity){ 
    cout << "Entering Simulation" << endl; 

    double time = 0; 
    double x = 1; 
    double y = 1; 
    double veloUp = 0; 
    double veloFo = 0; 

    veloUp = (velocity*sin(angle)); 
    veloFo = (velocity*cos(angle)); 
    cout << "Angle in radians: " << angle << endl; 
    cout << "Initial velocity upwards (fps): " << veloUp << endl; 
    cout << "Initial velocity forward (fps): " << veloFo << endl; 

    while(y >= GROUND){ 
     x = veloFo * time; 
     y = GRAVITY_FACTOR*(time*time) + (veloUp * time); 
     cout << "(x, y) at time " << time << " is (" << x << ", " << y << ")" << endl; 
     ++time; 
    } //while 
    cout << "Leaving Simulation" << endl; 
} //simulate 

/*************************************************************************** 
* The main function. 
* 
* Produces output to the console in order to coach the user on what to input. 
**/ 
int main() 
{ 
    cout << "Execution Beginning" << endl; 
    cout << "Enter the inital velocity (feet per second):" << endl; 
    cin >> initialVelocity; 

    if(initialVelocity > 0){ 
     cout << "Good. " << initialVelocity << " is a valid value for the initial velocity." << endl; 
    } 
    else{ 
     cout << "ERROR: " << initialVelocity << " is not a valid value for the initial velocity." <<endl; 
     return 0; 
    } 

    cout << "Enter the initial angle in degrees (from the horizontal):" << endl; 
    cin >> initialAngle; 

    if(initialAngle >= 0 && initialAngle <= 90){ 
     cout << "Good. " << initialAngle << " is a valid value for the initial angle." << endl; 
    } 
    else{ 
     cout << "ERROR: " << initialAngle << " is not a valid value for the initial angle." << endl; 
     return 0; 
    } 

    simulate(degToRad(initialAngle), initialVelocity); 

    cout << "Ending Execution" << endl; 
return 0; 
} 

Как я уже сказал, я новичок в C++, может кто-нибудь, пожалуйста, объясните, как эти два взаимодействуют, или что я должен сделать, чтобы они взаимодействовали более эффективно. Программа компилируется и работает корректно, но я не понимаю, что такое протокол и использует файлы заголовков с .cpp-файлом. Кроме того, какие функции и переменные должны находиться в закрытом разделе заголовка и которые должны публиковаться? Спасибо.

+3

Интересное имя «конструктора» у вас есть. (это не конструктор btw) – WhozCraig

+0

@WhozCraig это пугает меня ** Обратите внимание: вы никогда не создаете объект класса 'main'. в чем смысл этого класса? вы также не выполняете какие-либо функции в вашем 'class main' –

+0

@Trevor. Пожалуйста, измените это 'm' в 'int main(); // Конструктор 'и избавиться от int –

ответ

1

Я думаю, что вы должны знать 2 вещи:

  • Будет difference between declaration and definition.
    • вам нужна декларация использовать класс или функцию (для компилятора, чтобы знать его там)
    • определения является кодом, который компилируется (тело функции, инициализация)
  • Что #include делать.
    • #include просто копирует содержимое заголовка в исходный файл, включая его.

Это означает, что вы, вероятно, не хотите определения в файлах заголовков, потому что если несколько файлов включают в свой заголовок, вы нарушаете One-Definition-Rule, вызывая нескольких Defintion-ошибок на этапе компоновки.

Какие переменные следует объявлять, а какие нет в заголовочном файле?

Заголовок-файл - это ваш интерфейс к другим исходным файлам, которые хотят вызывать ваши функции/использовать ваши классы.
Таким образом, вы вводите декларации для вещей, которые необходимы для работы других исходных файлов.

Когда вы объявляете переменную в файле заголовка, следует ли использовать extern?

extern Ключевое слово задает декларацию для переменной, а не определения. Это означает, что ваше определение переменной находится где-то в другом месте (например, исходный файл).

Если вы хотите использовать GRAVITY_FACTOR в другом исходном файле, который включает в свой заголовок:

  • в вашем источнике: const int GRAVITY_FACTOR = -16;
  • в час заголовка: extern const int GRAVITY_FACTOR;

Примечания:

  • то, что у вас есть в файле заголовка, является cl задница определение
    • государственного и частного являются accessors к классу членов
    • вы можете скорее хотят имен здесь или обычные функции
    • main функция не имеет ничего общего внутри определения класса
0

В файле заголовка вы можете объявить все поля и функции класса, которые будут реализованы в файле cpp. Вы не должны объявлять переменные, которые будут использоваться внутри ваших функций класса (потому что они похожи на временные переменные), но вы можете объявлять (и должны) константные переменные, которые вы будете использовать в своей прогамме.

Вы не должны использовать extern, extern его для переменных, которые вы не определяете, и компилятор не беспокоит вас об этом, потому что, когда его extern, это означает, что переменная определяется где-то еще в вашей программе. ехЬегп также используется для функций, которые вы хотите обработать ваш C++ код, как это было в С. как:

экстерном «C» {// код. }

или extern "C" int func(int a);

В conclusion- delcare константные переменные в .h файле, и classes.else - в СРР (если его инлайн). в вашем случае:

const int GRAVITY_FACTOR = -16; 
const int GROUND = 0; 
const double PI = atan(1.0)*4; 
are better to be in the .h file 

+ вы не должны объявить его снова:

double initialVelocity; 
double initialAngle; 

его уже в .h файл.

Надеется, что это было полезно ..

+0

Да, спасибо @ Антон. Итак, суммируя его, в java вы объявляете переменные класса в верхней части класса, а на C++ то же самое является аналогом файла заголовка? –

+0

его не правило, но его хорошо для дизайна программы .. – member555

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