1) Включить заголовочные файлы, а не файлы cpp!
Удалить:
#include "Triangle.cpp"
причина:
Файлы cpp - это то, что компилируется.Они зависят от заголовочных файлов, а не наоборот.Заголовки могут зависеть от других заголовков, что часто происходит на самом деле.но они не должны зависеть от файла cpp.
2) Обернуть заголовки в блоки ifndef / define.
Move:
#ifndef TRIANGLE_H
и #define TRIANGLE_H
в начало файла над всем остальным.Стилистически вы можете прокомментировать, что файл делает над блоком ifndef / define вместо
Пример:
// This is the triangle header file! Here is where I describe it.
#ifndef TRIANGLE_H
#define TRIANGLE_H
// TODO: Put the includes here
// TODO: Put your class here
#endif
Причина:
В C ++ вы можете думать о строке: #include <iostream>
как о вставке копии содержимого файла iostream поверх этой строки.Поэтому, когда вы #include "triangle.h" в main.cpp и triangle.cpp, вы описываете, как будет выглядеть класс треугольника для каждого из этих файлов cpp.Файл main.cpp должен знать, чтобы он мог создавать и использовать треугольник, а файл triangle.cpp должен знать, чтобы он мог правильно реализовать функции в треугольнике.
Если вы дважды включите файл, этот файл будет эффективно скопирован-печено дважды.Обычно это будет переопределять его содержимое, что будет ошибкой компиляции.Блок ifndef / define говорит: «эй, если TRIANGLE_H еще не определен, это первый раз, когда он был включен. Поэтому давайте определим TRIANGLE_H вместе со всем содержимым файла. В следующий раз triangle.h будетвключаем, мы увидим, что TRIANGLE_H уже определен, и мы пропустим прямо содержимое этого заголовка, вместо того, чтобы переопределять, что такое Trinagle.
Причина, по которой я предлагаю вам переместить его наверх, это вывключаем iostream, triangle.cpp (мы уже говорили об этой части) и используем пространство имен std каждый раз, когда включается triangle.h. В этом нет необходимости.
3) Исправьте объявление класса треугольника
Изменение:
class Triangle(){
на
class Triangle {
Причина:
Вы близки! Новы путаете синтаксис объявления конструктора с синтаксисом объявления класса.
4) Делайте функции, которые вы намереваетесь использовать, вне Triangle общедоступными.
Move:
доступ "public:"указатель выше double Perim();
Причина:
Если вы хотите вызвать методы: Perim, Area и IsRect из main.cpp (или из anywehre, но внутрикласс треугольника!) вам нужно, чтобы эти методы были общедоступными.
У вас может возникнуть соблазн обнародовать все, но это дурной тон - и ваш инструктор специально сказал «инкапсулировать a, b, c».Вы можете погуглить шаблон проектирования инкапсуляции, чтобы понять, почему.Я не буду вдаваться в подробности.
5) Заполните ваш конструктор треугольника
См. Метод:
Triangle::Triangle(int aa, int bb, int cc)
Изменения:
В заголовочном файле вы не дадите названия трех параметров.Это не ошибка, но это странно.Вам, вероятно, следует дать имена этим параметрам.
В другом конструкторе (без параметров) вы показываете, что знаете, как назначать значения a, b и ca!Идите вперед и присвойте им значения в этом методе.
Подумайте, действительно ли вы хотите использовать int
в качестве типов параметров.Вы сохраняете длины сторон как двойные, но вы предоставляете их конструктору как целые.Это не ошибка, но это странно.
6) Исправить тело метода Set.
См. Метод:
Triangle::Set(double aa, double bb, double cc)
Примечание:
Помните, что метод обмена.Вы предоставляете ему его параметры, он выполняет некоторую работу и возвращает вам некоторое значение (если только он не «возвращает» void).Ваш метод запрашивает 3 двойных и возвращает бул.Если вы возвращаете логическое значение, вы соглашаетесь вернуть истинное или ложное значение.Здесь вы пытаетесь вернуть любой cout << "...";возвращается.Это не похоже на то, что вы хотите (даже если это компилируется).Вас не волнует, что возвращает cout, верно? </p>
Изменения:
Не обращайте внимания на эту функцию.Просто верните true, если треугольник возможен, и false, если это невозможно.Вы можете находить все, что хотите, откуда Сета вызывается.
7) Инкапсулируйте a, b, c.
Вы сделали ab и c приватными.Это половина инкапсуляции.Ваш инструктор вероятно хочет, чтобы вы написали метод получения и установки для этих переменных в треугольнике.
Пример:
double Triangle::GetA() {
return a;
}
void Triangle::SetA(double aa) {
a = aa;
}
Я уйдуэто как пример для выполнения всего остального.
8) Использование вашего треугольника в main.cpp
Если вы берете локальную переменную t
, вы можете вызывать функции для нее следующим образом:
t.SetA(1.1);
cout << t.GetA() << endl; // will print 1.1
double theValueOfA; // local variable
theValueOfA = t.GetA(); // store the result of GetA in our new variable
cout << theValueOfA << endl; // will also print 1.1
Получив эту информацию, после того, как вы закончите ваши звонки в cin для получения пользовательских вводов, сделайте следующее:
- создайте логическую переменную для хранения результата наборамы будем использовать это позже.
- вызовите функцию Set для t, предоставив 3 длины, введенные пользователем.Сохраните возврат Set в нашем логическом значении.
- Напишите утверждение if.Проверьте, является ли значение этого логического значения истинным.Если это так, выведите «Треугольник с этими параметрами возможен». В противном случае выведите «Треугольник с этими параметрами НЕЛЬЗЯ.» *
- Если ваше назначение требует, чтобы вы делали что-то еще или что-то иное, например,распечатав результат Perim, Area и isRect, сделайте это!