在C ++程序中使用头文件

时间:2013-05-22 07:38:31

标签: c++ class header

我对使用头文件编写C ++程序有一些疑问。

这是我的header.h文件:

#include <iostream>

using namespace std;

class Rectangle
{
public:
Rectangle(double width, double length);
double get_perimeter();
double  get_area();
void resize(double factor);

private:
double width;
double length;
double area;
double factor;
};

这是我的Question1.cpp文件,它存储了所有方法:

#include <iostream>

using namespace std;

class Rectangle
{
public:
Rectangle(double width, double length)
{
    width = width;  //I have no idea how to use this.something as its in Java
    length = length; //Problem probably occurs at here
}

double Rectangle::get_perimeter()
{
    return ((width * 2) + (length * 2)) ;
}

double Rectangle::get_area()
{
    return (width * length);
}

void Rectangle::resize(double factor)
{ 
    width *= factor;
    length *= factor;
}

private:
double width;
double length;
double area;
double factor;
};

最后,这是我的主要方法.cpp:

#include <iostream>
#include "header.h";

using namespace std;

int main()
{
Rectangle rectangle1(2.5,7.0);
cout << rectangle1.get_perimeter();
cout << rectangle1.get_area();

system("PAUSE");
return 0;
}

然而,当我尝试运行该程序时,系统告诉我存在构建错误和未解析的外部因素,我不知道为什么会这样。有人可以帮我解决一下吗?

提前致谢。

9 个答案:

答案 0 :(得分:2)

您的实施不应该像

class Rectangle
{
public:
Rectangle(double width, double length) { .... }

但是喜欢

Rectangle::Rectangle(double width, double length) : width(width), length(length) {}

您需要在实现header.h文件和任何需要.cpp类定义的文件中包含Rectangle。您的标头中还需要include guards。并且不要在头文件中使用名称空间std 。事实上,不要把它放在任何地方。

答案 1 :(得分:2)

将.h更改为 - &gt;

#include <iostream>

using namespace std;

class Rectangle
{
public:
    Rectangle(double width, double length);
    double get_perimeter();
    double  get_area();
    void resize(double factor);

private:
double width;
double length;
double area;
double factor;
};

然后.cpp到 - >

#include <iostream>
#include "header.h"
using namespace std;


Rectangle::Rectangle(double width, double length)
{
    this->width = width;  //I have no idea how to use this.something as its in Java
    this->length = length; //Problem probably occurs at here
}

double Rectangle::get_perimeter()
{
    return ((this->width * 2) + (this->length * 2)) ;
}

double Rectangle::get_area()
{
    return (this->width * this->length);
}

void Rectangle::resize(double factor)
{ 
    this->width *= factor;
    this->length *= factor;
}

这应该适用。 问候, 卢卡

答案 2 :(得分:2)

这里很难解开。

1)使用this->width,它等同于java的this.width(在C ++中,这是一个指针)。实际上一些C ++程序员(包括我)使用m_作为前缀成员变量。然后你可以写m_width = width

2)在Question1.cpp

的顶部加上“header.h”

3)避免在头文件中放入“using namespace std”,否则可能会出现意外的命名空间 代码扩展时发生冲突。可以把它放在单独的源文件中,尽管有些人甚至不鼓励这样做。

4)根据您的编译器和链接器,您需要链接到iostream库使用的各种lib。也许如果你告诉我们你正在使用的编译器,我们可以在这里帮助你。

5)你需要用

包围你的标题
#ifndef ARBITRARY_TEXT_BUT_DISTINCT_FROM_ANY_OTHER_IN_YOUR_PROGRAM
#define ARBITRARY_TEXT_BUT_DISTINCT_FROM_ANY_OTHER_IN_YOUR_PROGRAM
...your code here
#endif

这是一个包含保护 - 有助于防止多次包含头文件内容。

答案 3 :(得分:1)

在Question1.cpp中你必须包含header.h

不要忘记header.h中的包含守卫

同样在Question1.cpp中你必须改变

Rectangle(double width, double length)

Rectangle::Rectangle(double width, double length)

答案 4 :(得分:0)

您需要告诉构建系统编译“question1.cpp”。通常在“文件”下的某处“添加现有文件到项目”菜单项。

通常,您的类和构造函数将使用与输入参数不同的名称。许多人在前面(mLength,iLength)或后缀(长度为常见)添加前缀。

另一个解决方案是使用this->length为成员变量添加前缀,但一段时间后会变得非常混乱。

答案 5 :(得分:0)

在.cpp文件中你应该只实现不重写完整类实现的方法的大错误在.cpp文件中尝试以下内容

Rectangle :: Rectangle(双倍宽度,双倍长度) {     width = width; //我不知道如何在Java中使用this.something     长度=长度; //问题可能发生在这里 } 并且不包括类{}中的方法;阻止并且不重新定义您的成员变量 也不要忘记在.cpp文件中包含头文件

感谢

答案 6 :(得分:0)

我想知道你是否因为你的cpp文件有点奇怪而得到链接器错误

在cpp文件中包含.h文件,只实现

之类的功能
Rectangle::Rectangle(double width, double length){
 //implement
}

double Rectangle::get_perimeter(){
 //implement
}

double Rectangle::get_area(){
  //implement
}

void Rectangle::resize(double factor){
  //implement
}

答案 7 :(得分:0)

如果要将类文件拆分为* .cpp和* .h文件,它总是具有以下形式:

rectangle.h:

#ifndef __RECTANGLE_H_
#define __RECTANGLE_H_
#include <iostream>
using namespace std;

class Rectangle
{
public:
Rectangle(double width, double length);
double get_perimeter();
double  get_area();
void resize(double factor);

private:
double width;
double length;
double area;
double factor;
};
#endif

现在rectangle.cpp应该具有以下形式:

#include <iostream>
#include "rectangle.h"
using namespace std;

Rectangle(double width, double length)
{
    width = width;  //I have no idea how to use this.something as its in Java
    length = length; //Problem probably occurs at here
}

double Rectangle::get_perimeter()
{
    return ((width * 2) + (length * 2)) ;
}

double Rectangle::get_area()
{
    return (width * length);
}

void Rectangle::resize(double factor)
{ 
    width *= factor;
    length *= factor;
}

所以当作为解释时: 头文件告诉您哪些字段和方法可用,* .cpp文件实现这些方法。

在main.cpp中你只需要包含rectangle.h

答案 8 :(得分:0)

以下代码可以使用

#include<iostream>
#include<iomanip>
using namespace std;
class student
{
private:
int area;//hours;
float perimeter;//gpa;
public:
void addcourse(int len, float wid)
{
float sum;
sum = area * perimeter;
area += len;
sum += wid * len;
perimeter = sum / area;
}
student()   // constructor
{
area = 0;
perimeter= 0.0;
}
};


int main()
{
student s;
int length;//classhours;//l
float width;//classgpa;//w
cout << "Enter length ( 1 to end):  ";
cin >> length;
while(length !=  1)
{
cout << "Enter width:  ";
cin >> width;

s.addcourse(length, width);

cout << "Enter length ( 1 to end):   ";
cin >> length;
}

// cout << "Rectangle's length = " << r.getlength() << endl;
//    cout << "Rectangle's width = " << r.getwidth() << endl;
//    cout << "Rectangle's area = " << r.getarea() << endl;
//   cout << "Rectangle's perimeter = " << r.getperimeter() << endl;
}