我的小项目有问题。我有两节课。 问题:
错误:未在此范围内声明“显示”
显示是一个类。这是代码:
//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中 我有错误:
错误:“向量”未命名类型
所以我包含了向量库。
但这没有帮助。
答案 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>
答案 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的源文件。