Ryan_Li 发表于 2020-12-23 14:51:40

类的构造函数用指针接收字符串报错

#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

xieglt 发表于 2020-12-23 15:10:48

#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;
}

Ryan_Li 发表于 2020-12-23 15:57:00

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<<"未找到书籍!";
                }
        }
}

xieglt 发表于 2020-12-23 16:04:44

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

Ryan_Li 发表于 2020-12-23 16:05:59

xieglt 发表于 2020-12-23 15:10


黄色报错我搞定了 换成const就行了 我是傻*....但是如果输入一个不匹配的书名 会返回一个wrong walue

Ryan_Li 发表于 2020-12-23 16:11:57

xieglt 发表于 2020-12-23 16:04
因为你类构造函数是
Books(float pri,char* na,char *au,char *pu);
全是 char * 类型,但是 “平凡的 ...

搞定了 谢谢大佬!
页: [1]
查看完整版本: 类的构造函数用指针接收字符串报错