类的构造函数用指针接收字符串报错
#include <iostream>using namespace std;
class Books{
public:
Books(float pri,char* na,char *au,char *pu):price(pri),name(na),author(au),pub(pu){}
char* getName(){return name;}
void printinfo(){
cout<<price;
}
private:
const float price;
char *name;
char *author;
char *pub;
};
int main(){
Books b={
(39,"平凡的世界","路遥","上海交通大学出版社"),
(32.6,"假如给我三天光明","海伦凯勒","上海交通大学出版社"),
(21.4,"活着","余华","电子科技大学出版社"),
(45,"老人与海","海明威","北京师范大学出版社")}; //这里报错
char *search;
cout<<"请输入要查询的书名:";
cin>>search;
for(int i = 0;i<5;i++){
if(*b.getName() == *search){
b.printinfo();
}
}
}
报错信息: conversion from 'const char ' to non-scalar type 'Books' requested #include <iostream>
using namespace std;
class Books{
public:
Books(float pri,char* na,char *au,char *pu):price(pri),name(na),author(au),pub(pu){}
char* getName(){return name;}
void printinfo(){
cout<<price;
}
private:
const float price;
char *name;
char *author;
char *pub;
};
int main(){
//语法错误,应该改成
Books b= {
Books(39,"平凡的世界","路遥","上海交通大学出版社"),
Books(32.6,"假如给我三天光明","海伦凯勒","上海交通大学出版社"),
Books(21.4,"活着","余华","电子科技大学出版社"),
Books(45,"老人与海","海明威","北京师范大学出版社")};
//这么定义的字符串指针没有分配内存地址,是无法使用的。
//应该用以下几种方式定义:
//1: char search = {0};
//2: char * search = new char ;
//3: 用stl 的 string 类std::string search;
//相同的道理,在类里面定义的字符串指针也是有问题的。
//但是,上面的数组 b 的初始化没有问题。
char *search;
cout<<"请输入要查询的书名:";
cin>>search;
for(int i = 0;i<5;i++)
{
// c/c++不支持字符串 == 操作
//应该用函数 if(strcmp(str1,str2) == 0)
//加* 只是比较第一个字符是否相等
if(*b.getName() == *search)
{
b.printinfo();
}
}
return 0;
} xieglt 发表于 2020-12-23 15:10
x谢谢啦 但是还是有点问题就是返回wrong value而且有黄色警告在对象数组初始化的过程中
deprecated conversion from string constant to 'char*' [-Wwrite-strings]
#include <iostream>
#include <string.h>
using namespace std;
class Books{
public:
Books(float pri,char* na,char *au,char *pu):price(pri),name(na),author(au),pub(pu){}
char* getName(){return name;}
void printinfo(){
cout<<"书名:"<<name<<endl<<"作者:"<<author<<endl<<"出版社:"<<pub<<endl;
}
private:
const float price;
char *name;
char *author;
char *pub;
};
int main(){
Books b={
Books(39,"平凡的世界","路遥","上海交通大学出版社"),\
Books(32.6,"假如给我三天光明","海伦凯勒","上海交通大学出版社"),\
Books(21.4,"活着","余华","电子科技大学出版社"),\
Books(45,"老人与海","海明威","北京师范大学出版社")};
char search = {0};
cout<<"请输入要查询的书名:";
cin>>search;
for(int i = 0;i<5;i++){
if(strcmp(b.getName(),search) == 0){
cout<<"查询到书籍,以下是 "<<search<<" 的信息"<<endl;
b.printinfo();
break;
}
if(i == 4&&strcmp(b.getName(),search) != 0){
cout<<"未找到书籍!";
}
}
} Ryan_Li 发表于 2020-12-23 15:57
x谢谢啦 但是还是有点问题就是返回wrong value而且有黄色警告在对象数组初始化的过程中
depre ...
因为你类构造函数是
Books(float pri,char* na,char *au,char *pu);
全是 char * 类型,但是 “平凡的世界” 等字符串是常量,也就是 const char *
把常量赋给char * 是有问题的。
另外,你的循环结束条件i < 5 会造成数组越界,因为你的数组只有4个元素。
最好这样写:
#include <iostream>
#include <string>
using namespace std;
class Books
{
public:
Books(float pri,char* na,char *au,char *pu):price(pri),name(na),author(au),pub(pu){}
bool nameEqual(const char * _name)
{
return name.compare(_name) == 0 ? true : false;
}
void printinfo()
{
cout<<price;
}
private:
const float price;
string name;
string author;
string pub;
};
int main(){
Books b={
Books(39.0f,"平凡的世界","路遥","上海交通大学出版社"),
Books(32.6f,"假如给我三天光明","海伦凯勒","上海交通大学出版社"),
Books(21.4f,"活着","余华","电子科技大学出版社"),
Books(45.0f,"老人与海","海明威","北京师范大学出版社")};
char search = {0};
cout<<"请输入要查询的书名:";
cin>>search;
for(int i = 0;i<4;i++)
{
if(b.nameEqual(search))
{
b.printinfo();
break;
}
}
return 0;
}
xieglt 发表于 2020-12-23 15:10
黄色报错我搞定了 换成const就行了 我是傻*....但是如果输入一个不匹配的书名 会返回一个wrong walue xieglt 发表于 2020-12-23 16:04
因为你类构造函数是
Books(float pri,char* na,char *au,char *pu);
全是 char * 类型,但是 “平凡的 ...
搞定了 谢谢大佬!
页:
[1]