0

好的,所以我对 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 文件的使用。此外,哪些函数和变量应该在标题的私有部分,哪些应该在公共部分?谢谢你。

4

2 回答 2

1

我认为你需要知道两件事:

  • 声明和定义有什么区别
    • 你需要一个声明来使用一个类或函数(让编译器知道它在那里)
    • 定义是被编译的代码(函数体,初始化)
  • 有什么作用#include
    • #include只需将标头的内容复制到包含它的源文件中。

这意味着,您可能不希望在头文件中进行定义,因为如果多个文件包含您的头文件,则您违反了One-Definition-Rule,从而在链接阶段导致多个定义错误。

哪些变量应该声明,哪些不应该在头文件中声明?

头文件是您想要调用您的函数/使用您的类的其他源文件的接口。
因此,您为其他源文件工作所需的内容添加了声明。

当你在头文件中声明一个变量时,你应该使用extern?

extern关键字指定变量的声明而不是定义。这意味着您的变量定义在其他地方(例如您的源文件)。

如果您想GRAVITY_FACTOR在另一个源文件中使用,其中包括您的标头:

  • 在您的来源中:const int GRAVITY_FACTOR = -16;
  • 小时标题:extern const int GRAVITY_FACTOR;

评论:

  • 您当前在头文件中拥有的是类定义
    • public 和 private 是您班级成员的访问者
    • 你可能更喜欢这里的命名空间或普通函数
    • main函数在类定义中无关
于 2013-09-04T20:18:03.420 回答
0

在头文件中,您可以声明将在 cpp 文件中实现的所有类字段和函数。您不应该声明将在类函数中使用的变量(因为有类似临时变量),但是您可以声明(并且应该)将在程序中使用的 const 变量。

你不应该使用 extern,extern 它用于你没有定义它们的变量,编译器不会打扰你,因为当它的 extern 时,这意味着该变量是在你的程序中的其他地方定义的。extern 也用于您想要处理 c++ 代码的函数,就像在 C 中一样。例如:

extern "C" { //代码。}

或者extern "C" int func(int a);

总之 - delcare .h 文件中的 const 变量,以及 classes.else - 在 cpp 中(除非它的内联)。在你的情况下:

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 文件中。

希望有用。。

于 2013-09-04T18:48:56.107 回答