Перегрузка в функции на тип класса - PullRequest
0 голосов
/ 19 ноября 2018
#include <iostream>
#include <iomanip>
#include <cmath>
#include "lineType.h"
using namespace std;

int main()
{
    double x, y;
    double a = 1.; 
    double b = 0.; 
    double c = 1.; 
    double d = 2.; 
    double e = 0.; 
    double f = 3.; 
    double g = 0.; 
    double h = 4.; 
    double i = -1.;

    lineType line1(a, b, c);
    lineType line2(d, e, f);
    lineType line3(g, h, i);

    cout << "Line 1: ";
    line1.display();

    if (line1.isParallel(line2)) cout << "line1 is parallel to line 2" << endl;
    if (line1.isPerp(line3)) cout << "line 1 is perpendicular to line 3" << endl;

    if (line2.intersect(line3, x, y))
        cout << "The intersection of lines 2 and 3 is at point(" << x << ", " << y << ")" << endl;
    else
        cout << "Lines 2 and 3 do not intersect." << endl;

    return 0;
}

Это код, который я тестирую, и проблема, которую я получаю, - c2661, ни одна перегруженная функция не принимает 3 аргумента. Мой заголовочный файл: #pragma Once

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

class lineType
{
private:
    double a;
    double b;
    double c;
public:
    void display() const;
    bool isParallel(const lineType& line) const;
    bool isPerp(const lineType& line) const;
    bool intersect(const lineType& line, double& x, double& y);
    lineType();
    lineType(double a2, double b2, double c2);
    ~lineType();
};

Это требуемый файл lineType.cpp

#include "lineType.h"
#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

void lineType::display() const
{
    cout << a << "x + " << b << "y = " << c << endl;
}

bool lineType::isParallel(const lineType& line) const
{
    if (a == 0 && line.a == 0)
        return 1;
    if (b == 0 && line.b == 0)
        return 1;
    else if (-a / b == -line.a / line.b)
        return 1;
    else
        return 0;
}

bool lineType::isPerp(const lineType& line) const
{
    if (a == 0 && line.b == 0)
        return 1;
    if (b == 0 && line.a == 0)
        return 1;
    else if (-a / b == line.b / line.a)
        return 1;
    else
        return 0;
}

bool lineType::intersect(const lineType& line, double& x, double& y)
{
    if (a == 0)
        x = c / b;
    if (line.a == 0)
        x = line.c / line.b;
    if (b == 0)
        y = c / a;
    if (line.b == 0)
    {
        y = line.c / line.a;
    }
    else
    {
        x = ((a*line.c) - (c*line.a)) / ((b*line.a) - (a*line.b));
        y = ((c*line.b) - (b*line.c)) / ((b*line.a) - (a*line.b));
    }
    if (a == 0 && line.a == 0)
        return 0;
    if (b == 0 && line.b == 0)
        return 0;
    return 1;
}

lineType::lineType()
{
    a = 0;
    b = 0;
    c = 0;
}

lineType::lineType(double a2, double b2, double c2)
{
    a = a2;
    b = b2;
    c = c2;
}


lineType::~lineType()
{
}

Сообщение об ошибке, которое появляется Ошибка (активная) E0289 нет экземпляра конструктора "lineType :: lineType" соответствует списку аргументов Project1 строка 20 То же сообщение об ошибке для строк 21 и 22 в файле source.cpp. так что я не уверен, что происходит?

1 Ответ

0 голосов
/ 19 ноября 2018

lineType::lineType, который является конструктором, генерируется неявно, поскольку вы не предоставили никаких пользовательских конструкторов. Сгенерированные по умолчанию конструкторы не принимают аргументов, но вы пытаетесь указать три аргумента в строках:

lineType line1(a, b, c);
lineType line2(d, e, f);
lineType line3(g, h, i);

Я подозреваю, что вы хотели воспользоваться преимуществом агрегатной инициализации , которую вы, к сожалению, не можете использовать, поскольку ваши a, b и c переменные private. Возможно, вы захотите добавить такой конструктор самостоятельно:

lineType(const double a, const double b, const double c)
        :a(a), b(b), c(c) { }

Но это еще не все. У вас есть еще пара проблем с вашим кодом. В частности:

if (line1.isParallel(line2)) cout << "line1 is parallel to line 2" << endl;

содержит опечатку. Это должно быть isParrallel, как объявлено в вашем классе (что также является опечаткой) вместо isParallel. Исправьте любой из них.

Наконец, строка:

if (line2.intersect(line3, x, y))

не скомпилируется, поскольку intersect() возвращает void, а не bool. if операторы требуют, чтобы они были предоставлены либо bool s, либо что-то, что неявно преобразуется в тип bool. Сделайте так, чтобы ваша функция возвращала bool, что является логическим предположением для функции, имя которой начинается с is.

...