2013-05-22 2 views
-2

У меня есть вопрос для кодирования программы на C++ с файлом заголовка.Использование файла заголовка в программе на 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; 
} 

Однако, когда я пытаюсь запустить программу, система сообщила мне, что были ошибки сборки и неразрешенные которые я понятия не имею, почему это так. Может кто-нибудь, пожалуйста, помогите мне исправить это?

Заранее спасибо.

+0

вам необходимо включить header.h в файле questestion CPP, и вы должны использовать этот указатель: this-> width = width; – dinony

+1

Не используйте 'использование пространства имен ...' в своих заголовках. – soon

+1

Каковы ошибки?Какие строки вызвали ошибки? Вы проверили http://sscce.org/? –

ответ

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 в заголовок. На самом деле, не кладите его нигде.

+0

Так что я просто пишу #include guard в заголовочный файл? Но есть ошибка – Yvonne

+0

@Yvonne Прочтите ссылку на включить охранников. Он говорит вам, что делать. – juanchopanza

+0

Хорошо получилось спасибо – Yvonne

1

В Question1.cpp вы должны включить header.h

И не забудьте включить охранников в header.h

Также в Question1.cpp вы должны изменить

Rectangle(double width, double length) 

к

Rectangle::Rectangle(double width, double length) 
0

Вам необходимо сообщить вашей системе сборки для компиляции «question1.cpp». Обычно есть пункт меню «Добавить существующий файл в проект» в разделе «Файл».

И как правило, ваш класс и конструктор будут использовать другое имя, чем входной параметр. Многие люди ставят префикс в начале (mLength, iLength) или постфикс в конце (длина_ является общей).

Другим решением является префикс переменной-члена this->length, но через некоторое время может стать довольно грязным.

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 to->

#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; 
} 

Это должно работать тогда. С уважением, Luka

+0

приятный и полный ответ – ahmedsafan86

+0

Спасибо. Оно работает. – Yvonne

2

Немного вещей, чтобы разблокировать здесь.

1) использовать this->width, что эквивалентно java this.width (В C++ это указатель). На самом деле некоторые программисты на C++ (включая меня) префиксные переменные-члены с m_. Тогда вы можете просто написать m_width = width.

2) включают в себя «header.h» в верхней части Question1.cpp

3) избежать ввода «с использованием патезраса» в файле заголовок, или вы могли бы получить непреднамеренное пространства имен столкновений, как ваш код расширяется. ОК, чтобы поместить его в отдельные исходные файлы, хотя некоторые люди даже отговаривают это.

4) в зависимости от вашего компилятора и компоновщика вам нужно будет ссылаться на различные библиотеки lib, которые использует библиотека 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 

Это включает охранник - помогает предотвратить многократное включение файла заголовка содержимого.

0

большая ошибка, что в файле .cpp вы должны реализовать только методы не переписать реализацию полного класса попробовать следующее в .cpp файле

Rectangle :: Прямоугольник (двойной ширины, двойной длины) { ширина = ширина; // Я понятия не имею, как использовать this.something как его в Java length = length; // Проблема, вероятно, возникает здесь } и не включает методы в класс {}; блок и не переопределять переменные члены также не забудьте включить файл заголовка в файле .cpp

благодаря

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 
} 
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 вам просто нужно включить O rectangle.h

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; 
} 
Смежные вопросы