繁体   English   中英

在C ++中从.h文件访问类

[英]accessing classes from a .h file in C++

您好,我是在程序中使用头文件和OPP的新手,我想知道为什么Visual Studio 2010会指出我的代码中有错误。 该代码可以按需编译并运行,但是所有对象下都有红线

这是头文件

//functions.h
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <string>

using namespace std;

class vehicle
{
public:
int hp;
int ammo;
void displayHP();
void displayAmmo();
void displayName();
string vesselName;
void setName(string);
void moveUP(int& y);
void moveDown(int& y);
void moveLeft(int &x);
void moveRight(int &x);
private:
};
 //implementation section
void vehicle::displayHP(){cout<<hp<<endl;}
void vehicle::displayAmmo(){cout<<ammo<<endl;}
void vehicle::setName(string name){vesselName=name;}
void vehicle::displayName(){cout<<vesselName<<endl;}
void vehicle::moveUP(int& y)
    {
        y=y-1;//moves boat up
        system("cls");  
    }
void vehicle::moveDown(int& y)
{
        y=y+1;//moves boat down
        system("cls");
}
void vehicle::moveLeft(int &x)
{
        x=x-1;// moves the boat left
        system("cls");      
}


void vehicle::moveRight(int &x)
{
    x=x+1;//moves boat right
    system("cls");
}
void moveBoat(int &x,int& y, int a,int b,int s,int turn)
{

这是包含船只运动的头文件。 该程序可以正常编译并按设计工作,但我感到困惑,为什么Visual Studio声称存在太多错误,所以我在boat.h文件中的错误位置添加了行注释

//boat.h
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <string>
#include "functions.h"

using namespace std;

void moveBoat(int &x,int& y, int,int,int,int);
void youScrewedUp(int &x,int& y, int,int,int,int);



int movement=0;

 vehicle destroyer;
    destroyer.hp=500;//<==== getting a red line under the word destroyer error   says "this deceleration has no storage class or type specifier"
    destroyer.ammo=500;//<==== getting a red line under the word destroyer error   says "this deceleration has no storage class or type specifier"



displayArray(x,y,a,b,s);//<===="this deceleration has no storage class or type specifer"
destroyer.setName("USS YAY I LEARNED CLASSES");//<===="this deceleration has no storage class or type specifer"
destroyer.displayName();//<===="this deceleration has no storage class or type specifer"
destroyer.displayHP();//<===="this deceleration has no storage class or type specifer"
cout<<"Boat Location X "<<x<<" Y "<<y<<endl;
if(s==1)
{
cout<<"ENEMY SHIP SIGHTED"<<endl;//<===="this deceleration has no storage class or type specifer"
}
cout<<"1.move left"<<endl;//<===="this deceleration has no storage class or type specifer"
cout<<"2.move right"<<endl;//<===="this deceleration has no storage class or type specifer"
cout<<"3.move up"<<endl;//<===="this deceleration has no storage class or type specifer"
cout<<"4.move down"<<endl;//<===="this deceleration has no storage class or type specifer"
cin>>movement;<===="this deceleration has no storage class or type specifer"

    switch(movement)//<==expected a deceleration 
    {
    case 1:
        if(x>0)//does not allow boat to leave grid
        {
            destroyer.moveLeft(x);
        }
        else
        {
            youScrewedUp(x,y,turn,a,b,s);// function that repeats the movement function and displays a message
        }
        break;

        case 2:
        if(x<9)//boundary
        {
            destroyer.moveRight(x);
        }
        else
            {
            youScrewedUp(x,y,turn,a,b,s);
            }
        break;

        case 3:
        if(y>0)//boundary
        {
            destroyer.moveUP(y);
        }
        else
            {
            youScrewedUp(x,y,turn,a,b,s);
            }
        break;

        case 4:
        if(y<9)//boundary
        {
            destroyer.moveDown(y);
        }
        else
            {
            youScrewedUp(x,y,turn,a,b,s);
            }
        break;


    }
    turn++;//adds one to the turn counter to cycle to the enemies turn



}

void youScrewedUp(int &x, int &y,int turn, int a, int b,int s)// must pass the x y values by refferance
{
cout<<"where are you going your leaving the battlefield"<<endl;
            cout<<"please make another selection"<<endl;
            system("pause");
            system("cls");
            moveBoat(x,y,turn,a,b,s);
}

这是我的main()

// arrayTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "array.h"
#include "boat.h"
#include "enemy.h"
#include <iostream>
#include <ctime>

using namespace std;

int main()
{
int turn=1;// turn counter cycles between 1 and 2 during player and enemy turns
int x=7;//x coordinate for destroyer
int y=6;//y coordinate for destroyer            
int a=3;//x coordinate for sub
int b=4;//y coordinate for sub
int s=0;//toggle for submerged or not chose not to use a bool because I used a random number generator to allow a 25% chance opposed to a 50% chance
srand (time(NULL));

do{
    moveBoat(x,y,turn,a,b,s);//function that moves the boat
    moveEnemy(a,b,turn,x,y,s);//function to move the enemy
}while(turn<3);// this is temporary will be replaced when a hp and weapons system is completed
    system("pause");
return 0;
}

这超出了您的基本问题,并增加了一些其他方面的内容,这些内容将改善您的代码并有望理解。

  1. 您需要将“主要”功能代码按字面意义放在主要功能中

     int main(int argc, char * argv[]) { //do stuff here.... return 0; } 
  2. 您应该包括头文件保护,以防止您多次包含“ function.h”。 我也强烈建议将其重命名为Vehicle.h ,以表示它正在提供的类。

     #ifndef __VEHICLE_H__ #define __VEHICLE_H__ //... all the good stuff. #endif 
  3. 我强烈建议您从头文件中删除using namespace std ,因为这样做会破坏希望使用头文件的任何人的命名空间。 相反,只需在需要的地方使用std:: ,或者如果您真的不想在任何地方使用它们,请考虑using std::xyz; 针对您正在使用的特定功能。 这样,至少您以后可以跟踪冲突。 如果要在实现文件(即*.c )中执行此操作, *.c您决定; 但不要在通常包含的文件中执行此操作。

  4. 不要在头文件中包含不使用的头。 这是一个坏习惯,会导致代码和编译器膨胀,并不可避免地在以后引起痛苦。 您不应在每个标头中都包含ctimestdafx ,因为它们没有引用它。

  5. 您需要将浮在boat.h的“东西” boat.h放入函数中

     //somefunct void somefunction() { int movement=0; vehicle destroyer; destroyer.hp=500;//<==== getting a red line under the word destroyer error says "this deceleration has no storage class or type specifier" destroyer.ammo=500;//<==== getting a red line under the word destroyer error says "this deceleration has no storage class or type specifier" //.... Everything else } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM