-2

我有一些关于使用头文件编码 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;
};

最后,这是我的主要 method.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;
}

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

提前致谢。

4

9 回答 9

2

你的实现不应该看起来像

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

但喜欢

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

您需要包含header.h在实现.cpp文件和任何需要Rectangle类定义的文件中。您还需要在标题中包含警卫。并且不要将 using namespace std 放在 header中。事实上,不要把它放在任何地方。

于 2013-05-22T07:41:28.267 回答
2

将 .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;
};

然后 .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;
}

这应该工作。问候,卢卡

于 2013-05-22T07:44:34.157 回答
2

很少有东西可以在这里取消。

1) usethis->width等价于 java 的this.width(在 C++ 中,这是一个指针)。实际上,一些 C++ 程序员(包括我)在成员变量前面加上m_. 然后你就可以写了m_width = width

2) 在 Question1.cpp 的顶部包含“header.h”

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

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

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

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

于 2013-05-22T07:45:01.703 回答
1

在 Question1.cpp 你必须包括 header.h

并且不要忘记在 header.h 中包含守卫

同样在 Question1.cpp 你必须改变

Rectangle(double width, double length)

Rectangle::Rectangle(double width, double length)
于 2013-05-22T07:42:47.720 回答
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
}
于 2013-05-22T07:46:18.280 回答
0

当您想将类文件拆分为 *.cpp 和 *.h 文件时,它始终具有以下形式:

矩形.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

于 2013-05-22T07:47:43.847 回答
0

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

通常,您的类和构造函数将使用与输入参数不同的名称。许多人在开头添加前缀(mLength,iLength)或在末尾添加后缀(length_ 很常见)。

另一种解决方案是在成员变量前面加上this->length,但这会在一段时间后变得非常混乱。

于 2013-05-22T07:43:06.853 回答
0

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

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

谢谢

于 2013-05-22T07:45:03.673 回答
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;
}
于 2016-11-06T00:23:53.117 回答