如何使其运作,遇到2类问题

时间:2019-01-31 15:05:50

标签: c++ c++11

我的小项目有问题。我有两节课。 问题:

  

错误:未在此范围内声明“显示”

显示是一个类。这是代码:

//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.h中 我有错误:

  

错误:“向量”未命名类型

所以我包含了向量库。

但这没有帮助。

2 个答案:

答案 0 :(得分:4)

错误号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>

See a Live Example

答案 1 :(得分:-1)

一个原因是,考虑到您正在创建Display之类的对象,因此Display aa;类没有默认构造函数。默认构造函数是不带参数的构造函数。仅当您不为类提供任何构造函数时,编译器才隐式提供默认构造函数作为综合默认构造函数。如果为类提供自己的构造函数,则还必须显式提供默认构造函数。因此,在您的情况下,您实际上应该通过提供参数来创建像Display aa(argument, argument);这样的Display对象。但是,如果要创建类似Display aa;的对象,请在Display () { }文件中添加Display() = default;Display.h

考虑到您像我描述的方式创建对象,但仍然出现错误,另一个原因可能是您没有编译包含Display (int,int);构造函数定义的源文件(不仅仅是像您在声明中那样声明)头文件)以及包含main函数的源文件。如果您这样做了,但仍然在编译中遇到错误,那么我认为这是一个编译器问题,然后尝试添加应该编译代码的前向声明class Display;。但是Display的定义必须在main函数的可见范围内,否则前向声明将无济于事。

无论如何,您必须确保类的定义在创建类对象的main函数的可见范围内。仅具有声明但没有定义的类类型称为不完整类型,并且您不能创建不完整类型的对象。因此,在Display (int,int);Display.h构造函数的声明是不够的。您还需要在main函数的可见范围内对其进行定义。您可以在与主文件相同的文件,与标头相同的文件中进行操作,也可以在具有Display类,其数据成员和成员函数的完整定义的单独源文件中(这是最佳做法)。但是,您必须确保编译该源文件以及包含main的源文件。