Blue shirt
Blue shirt

Reputation: 13

How to make it work, problem with 2 classes

i have problem with my small project. I have two classes in it. Problem:

error: 'Display' was not declared in this scope

Display is a class. Here is code:

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

I was thinking that maybe vectors are doing problems. I tested it without vectors, but it didn't change anthing.

//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);
    }
}

Now it's Polynomial class it's working fine, but Display class no, and i don't know why.

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

Edit: After few tries i am one step back, Now in Display.h i have error :

error: 'vector' does not name a type

So i included vector lib.

But it didn't help.

Upvotes: 1

Views: 116

Answers (2)

Elijah Dayan
Elijah Dayan

Reputation: 452

One reason is that your Display class has no default constructor, considering you're creating object like Display aa; . A default constructor is the constructor that has no arguments. Default constructors are provided implicitly by compiler as synthesized default constructor only if you don't provide any constructors to your class. If you provide your own constructors to your class, you must also explicitly provide a default constructor. So in your case, you should actually create Display object like this Display aa(argument, argument); by providing arguments. However, If you want to create object like Display aa; then add either Display () { } or Display() = default; in your Display.h file.

Considering you created object like the way I described but still getting an error, another reason could be that you're not compiling the source file that contains the Display (int,int); constructor definition (not just declaration as you did in your header file) along with the source file that contains the main function. If you did that but still getting an error in compilation, then I would assume it is a compiler issue and try adding a forward declaration class Display; which should compile the code. But the definition of Display has to be within the visible range of main function otherwise a forward declaration would do nothing.

In any case, you have to make sure the definition of your class is within the visible range of the main function that creates the class object. A class type with only declaration without a definition is called incomplete type and you cannot create an object of incomplete type. So the declaration of your Display (int,int); constructor in the Display.h is not enough. You also need a definition of that within the visible range of main function. You can either do that in the same file as main, same file as header, or a separate source file (which is the best practice) that has the complete definition of Display class, its data members, and member functions. However, you must make sure to compile that source file along with the source file containing main.

Upvotes: -1

Moia
Moia

Reputation: 2364

Error Number 1:

You defined a constructor with 2 parameters

Display(int a, int b);

But when you call

Display aa;

Compiler try to instantiate a Display object with a default constructor, that you disabled defining a custom costructor;

you have 2 possibilities:

Adding a default constructor like

Display() = default;

or

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

Instantiate your variable using the constructor you defined

Display aa{0,0};

Error number 2:

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

You declared vector<char> instead of std::vector<char>

See a Live Example

Upvotes: 3

Related Questions