我对使用头文件编写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;
}
然而,当我尝试运行该程序时,系统告诉我存在构建错误和未解析的外部因素,我不知道为什么会这样。有人可以帮我解决一下吗?
提前致谢。
答案 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;
}