#include
#include<string>
#include
using namespace std;
class Container
{
protected:
static double pi;
public:
virtual double area()=0; //纯虚函数,计算对象的表面积
virtual double volume()=0; //纯虚函数,计算对象的体积
static double sumofarea(Container *c[],int n) ; //静态成员函数,计算所有对象的面积之和(指针数组)
static double sumofvolume(Container *c[],int n); //静态成员函数,计算所有对象的体积之和
};
double Container::pi=3.1415926;
Container *c[100];
double sumofarea(Container *c[],int n)
{
double s=0;
int i=0;
for(i=0;iarea();
}
cout<<setprecision(2)<return s;
}
double sumofvolume(Container *c[],int n)
{
double v=0;
int i=0;
for(i=0;ivolume();
}
cout<<setprecision(2)<return v;
}
class Cube:public Container //立方体
{
public:
double a;
Cube(){}
Cube(double len):a(len){}
virtual double area()
{
return a*a*6;
}
virtual double volume()
{
return a*a*a;
}
};
class Cylinder:public Container
{
public:
double r;
double h;
Cylinder(){}//不带参构造函数
Cylinder(double R,double h):r(R),h(h){}//构造函数
virtual double area()
{
return pi*r*r+2*pi*r*h;
} //求面积
virtual double volume()
{
return pi*r*r*h;
}//求体积
};
//Cube类、Cylinder类均继承抽象类Container。
//Cube类(属性:边长double类型)、Cylinder类(属性:底圆半径、高,double类型)。
int main()
{
Cube *pbe; Cylinder *per;
int n,i;
cin>>n;
for(i=0;istring c;
cin>>c;
if(c=="cube"){
pbe=new Cube();
cin>>pbe->a;
c[i]=pbe;}//将指向cube类的指针存放到指针数组中
if(c=="cylinder"){
per=new Cylinder();
cin>>per->r>>per->h;
c[i]=per;}
}
sumofarea(c,n);
sumofvolume(c,n);
return 0;
}
为什么会出现这个问题报错[Error] invalid conversion from 'Cube*' to 'char' [-fpermissive]
以及[Error] invalid conversion from 'Cylinder*' to 'char' [-fpermissive]
基于Monster 组和GPT的调写:
在main函数的for循环中,当输入“cube”或“cylinder”时,你试图将指向Cube或Cylinder对象的指针赋值给字符数组c中的c[i]元素,这是错误的操作,因为c[i]的类型是char而不是Cube或Cylinder指针类型。正确的做法是将c[i]赋值为指向Cube或Cylinder对象的指针,即c[i] = pbe或c[i] = per。你可以这样修改你的代码:
Cube *pbe;
Cylinder *per;
Container *c[100];
int n,i;
cin>>n;
for(i=0;i<n;i++){
string obj_type;
cin>>obj_type;
if(obj_type=="cube"){
pbe=new Cube();
cin>>pbe->a;
c[i]=pbe;
}
if(obj_type=="cylinder"){
per=new Cylinder();
cin>>per->r>>per->h;
c[i]=per;
}
}
我的代码中也有这几步操作
Cube *pbe;
Cylinder *per;
c[i]=per
c[i]
// main.cpp
// 哈夫曼编码
//
// Created by 梦有蝶 on 2019/11/15.
// Copyright © 2019 梦有蝶. All rights reserved.
//
#include <iostream>
#include <string.h>
using namespace std;
int main() {
int n,m;//n为节点个数,m为待检测编码的套数
cin>>n;
char NodeName[n];//存放节点名称
unsigned int c[n*2-1][2];
//定义无符号数int型二维数组,数组长度为哈夫曼树的节点个数,其中c[*][0]存放的是该节点的权值,c[*][1]为该节点的【父节点的位序】
unsigned int cl[n];//定义无符号数int型数组,用来存放各个节点到根节点的路径长度
//数组初始化
for (int i=0;i<n; i++)
{
cin>>NodeName[i];
cin>>c[i][0];
c[i][1]=0;
cl[i]=0;
}
for(int i=0;i<n-1;i++)
{
c[n+i][0]=0;
c[n+i][1]=0;
}
//数组构建
for (int i=0; i<n-1; i++) {
int min=0;
while (c[min][1]!=0) {//找到第一个c[j][1]=0的,即找到第一个没有父节点的节点
min++;
}
for(int j=0;j<n+i;j++)//在c[j][1]=0(没有父节点的节点)之中找到权值最小的
{
if(c[j][1]==0)
{
if(c[j][0]<c[min][0])
min=j;
}
}
c[min][1]=n+i;//此时找到的节点,把数组中第一个未使用(但是已经被赋值为0,0)的节点的位序作为它的【父节点的位序】
c[n+i][0]=c[min][0];//父节点的权值等于子节点的权值之和
min=0;
while (c[min][1]!=0) {
min++;
}
for(int j=0;j<n+i;j++)//再次在没有父节点的节点之中找到权值最小的
{
if(c[j][1]==0)
{
if(c[j][0]<c[min][0])
min=j;
}
}
c[min][1]=n+i;//此时找到的节点,把数组中第一个未使用(但是已经被赋值为0,0)的节点作为它的【父节点的位序】
c[n+i][0]+=c[min][0];//父节点的权值等于子节点的权值之和
}
//计算各个节点的路径长度
for(int i=0;i<n;i++)
{
//数组构建完成后,只有最后一个节点没有父节点
while (c[i][1]!=0) {//最后一个父节点的【父节点的为序】为0
c[i][1]=c[c[i][1]][1];//子节点向上寻父节点,将当前节点的父节点的【父节点的位序】作为当前节点的【父节点的位序】
cl[i]++;//路径长度加一
}
}
//计算总路径长度
int Length=0;
for(int i=0;i<n;i++)
Length+=c[i][0]*cl[i];
cin>>m;//读取待检测的编码的套数
int p[m];//用来存取各套编码是否为哈夫曼编码,是则为1,否则为0
for(int i=0;i<m;i++)//为p[m]赋初始值为1
p[i]=1;
char cn[m][n];//建立字符数组存储节点名称
string hc[m][n];//建立字符串数组存储待检测的哈夫曼编码
for(int i=0;i<m;i++)//读取节点名称以及编码
for(int j=0;j<n;j++)
{
cin>>cn[i][j];
cin>>hc[i][j];
}
//检测哈夫曼编码
for (int i=0; i<m; i++) {
int l=0;
for (int j=0; j<n; j++) {
l+=c[j][0]*hc[i][j].length();
}
if(l!=Length)//如果编码总长度与哈夫曼编码总长度不一致
{
p[i]=0;
continue;
}
else
{
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
{
if(k!=j)
{
int q;
q = hc[i][j].find(hc[i][k]);
//在hc[i][j]这个字符串中查找hc[i][k],并把找到的位置返回给q
if(q==0)
//如果找到的是第一个位置,说明编码不是前缀码,不是哈夫曼编码
p[i]=0;
}
}
}
}
//输出结果
for(int i=0;i<m;i++)
{
if(p[i]==1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}