Как заставить это работать, проблема с 2 классами - PullRequest
0 голосов
/ 31 января 2019

У меня проблема с моим небольшим проектом.У меня есть два класса в нем.Проблема:

ошибка: 'Дисплей' не был объявлен в этой области

Дисплей является классом.Вот код:

//main.cpp
#include <iostream>
#include "Display.h"
#include "Polynomial.h"

using namespace std;

int main()
{
    Polynomial prr;
    prr.show();
    cout<<endl;
    cout<<"Enter x= ";
    int x;
    cin>>x;
    cout<<endl;

    cout<<"value for x="<<x<<endl<<"y="<<prr.value(x);

    Display aa; // this doesn't work
    //abc.show();

    return 0;
}

//Display.h
#ifndef DISPLAY_H
#define DISPLAY_H

class Display
{
    std::vector <vector <char> > graph;
    public:
        Display(int a, int b);
        //friend void lay(Polynomial abc,Display cba);
        //void show();
};

#endif // DISPLAY_H

Я думал, что, возможно, векторы создают проблемы.Я тестировал его без векторов, но он не изменил муравейник.

//Display.cpp
#include "Display.h"
#include <iostream>

using namespace std;


Display::Display(int a, int b)
{
    //ctor
    if(a%2==0)
        a++;
    if(b%2==0)
        b++;

    vector <char> help;
    vector <char> mid;

    for(int i=0; i<b; i++)
    {
        mid.push_back('-');
        if(i==(b+1)/2)
            help.push_back('|');
        else
            help.push_back(' ');
    }

    for(int i=0; i<a; i++)
    {
        if(i==(a+1)/2)
            graph.push_back(mid);
        else
            graph.push_back(help);
    }
}

Теперь это класс полиномов, он работает нормально, но класс отображения нет, и я не знаю почему.

//Polynomial.h
#ifndef POLYNOMIAL_H
#define POLYNOMIAL_H
#include <vector>



//class Display;

class Polynomial
{...}


#endif // POLYNOMIAL_H

//Polynomial.cpp
#include "Polynomial.h"
#include <iostream>
#include <windows.h>
#include <cmath>

using namespace std;

// constructors and methods here
// everything here working fine

Редактировать: после нескольких попыток я на шаг назад, теперь в Display.hi есть ошибка:

ошибка: «вектор» не называет тип

Итак, я включил вектор lib.

Но это не помогло.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Ошибка номер 1:

Вы определили конструктор с 2 параметрами

Display(int a, int b);

Но когда вы вызываете

Display aa;

Попытка компиляторадля создания экземпляра объекта Display с помощью конструктора по умолчанию, который вы отключили при определении пользовательского конструктора;

у вас есть 2 возможности:

Добавление конструктора по умолчанию, например

Display() = default;

или

Display() { /* do whatever you want to init with default parameter */}

Создание экземпляра вашей переменной с помощью заданного вами конструктора

Display aa{0,0};

Ошибка № 2:

std::vector < std::vector <char> > graph;

Вы объявили vector<char>вместо std::vector<char>

См. живой пример

0 голосов
/ 31 января 2019

Одной из причин является то, что в вашем классе Display нет конструктора по умолчанию, учитывая, что вы создаете объект, подобный Display aa;.Конструктор по умолчанию - это конструктор без аргументов.Конструкторы по умолчанию неявно предоставляются компилятором как синтезированный конструктор по умолчанию, только если вы не предоставляете никаких конструкторов вашему классу.Если вы предоставляете свои собственные конструкторы вашему классу, вы также должны явно предоставить конструктор по умолчанию.Таким образом, в вашем случае вы должны создать объект Display, подобный этому Display aa(argument, argument);, указав аргументы.Однако, если вы хотите создать объект типа Display aa;, добавьте Display () { } или Display() = default; в ваш файл Display.h.

Учитывая, что вы создали объект, как я описал, но все равно получаете ошибку,Другая причина может заключаться в том, что вы не компилируете исходный файл, содержащий определение конструктора Display (int,int); (а не просто объявление, как вы делали это в заголовочном файле) вместе с исходным файлом, который содержит функцию main.Если вы сделали это, но все еще получаете ошибку при компиляции, то я бы предположил, что это проблема компилятора, и попытался бы добавить предварительное объявление class Display;, которое должно компилировать код.Но определение Display должно быть в пределах видимого диапазона функции main, иначе прямое объявление ничего не даст.

В любом случае, вы должны убедиться, что определение вашего класса находится в пределахвидимый диапазон функции main, которая создает объект класса.Тип класса с единственным объявлением без определения называется неполным типом, и вы не можете создать объект неполного типа.Поэтому объявление вашего Display (int,int); конструктора в Display.h недостаточно.Вам также необходимо определить это в видимом диапазоне функции main.Вы можете сделать это либо в том же файле, что и основной, в том же файле, что и заголовок, либо в отдельном исходном файле (что рекомендуется), который содержит полное определение класса Display, его элементов данных и функций-членов.Однако вы должны обязательно скомпилировать этот исходный файл вместе с исходным файлом, содержащим main.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...