鱼C论坛

 找回密码
 立即注册
查看: 1003|回复: 5

[已解决]类的构造函数用指针接收字符串报错

[复制链接]
发表于 2020-12-23 14:51:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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[4]={
        (39,"平凡的世界","路遥","上海交通大学出版社"),
        (32.6,"假如给我三天光明","海伦凯勒","上海交通大学出版社"),
        (21.4,"活着","余华","电子科技大学出版社"),
        (45,"老人与海","海明威","北京师范大学出版社")};                   //这里报错
        
        char *search;
        cout<<"请输入要查询的书名:"; 
        cin>>search;
        for(int i = 0;i<5;i++){
                if(*b[i].getName() == *search){
                        b[i].printinfo();
                }
        } 
}


                报错信息:[Error] conversion from 'const char [19]' to non-scalar type 'Books' requested
最佳答案
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[4]= {
                        Books(39,"平凡的世界","路遥","上海交通大学出版社"),
                        Books(32.6,"假如给我三天光明","海伦凯勒","上海交通大学出版社"),
                        Books(21.4,"活着","余华","电子科技大学出版社"),
                        Books(45,"老人与海","海明威","北京师范大学出版社")};
        
    //这么定义的字符串指针没有分配内存地址,是无法使用的。
        //应该用以下几种方式定义:
        //1: char search[64] = {0};
        //2: char * search = new char [64];
        //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[i].getName() == *search)
                {
                        b[i].printinfo();
                }
    }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[4]= {
                        Books(39,"平凡的世界","路遥","上海交通大学出版社"),
                        Books(32.6,"假如给我三天光明","海伦凯勒","上海交通大学出版社"),
                        Books(21.4,"活着","余华","电子科技大学出版社"),
                        Books(45,"老人与海","海明威","北京师范大学出版社")};
        
    //这么定义的字符串指针没有分配内存地址,是无法使用的。
        //应该用以下几种方式定义:
        //1: char search[64] = {0};
        //2: char * search = new char [64];
        //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[i].getName() == *search)
                {
                        b[i].printinfo();
                }
    }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 15:57:00 | 显示全部楼层

x谢谢啦 但是还是有点问题就是返回wrong value而且有黄色警告在对象数组初始化的过程中
[Warning] 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[4]={
        Books(39,"平凡的世界","路遥","上海交通大学出版社"),\
        Books(32.6,"假如给我三天光明","海伦凯勒","上海交通大学出版社"),\
        Books(21.4,"活着","余华","电子科技大学出版社"),\
        Books(45,"老人与海","海明威","北京师范大学出版社")}; 
        char search[64] = {0};
        cout<<"请输入要查询的书名:";
        cin>>search; 
        for(int i = 0;i<5;i++){
                if(strcmp(b[i].getName(),search) == 0){
                        cout<<"查询到书籍,以下是 "<<search<<" 的信息"<<endl; 
                        b[i].printinfo();
                        break;
                }
                if(i == 4&&strcmp(b[i].getName(),search) != 0){
                        cout<<"未找到书籍!";
                }
        } 
} 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 16:04:44 | 显示全部楼层
Ryan_Li 发表于 2020-12-23 15:57
x谢谢啦 但是还是有点问题就是返回wrong value而且有黄色警告在对象数组初始化的过程中
[Warning] 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[4]={
                        Books(39.0f,"平凡的世界","路遥","上海交通大学出版社"),
                        Books(32.6f,"假如给我三天光明","海伦凯勒","上海交通大学出版社"),
                        Books(21.4f,"活着","余华","电子科技大学出版社"),
                        Books(45.0f,"老人与海","海明威","北京师范大学出版社")};
        
        char search[64] = {0};

    cout<<"请输入要查询的书名:"; 
    cin>>search;
    for(int i = 0;i<4;i++)
        {
                if(b[i].nameEqual(search))
                {
                        b[i].printinfo();
                        break;
                }
    }         
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 16:05:59 | 显示全部楼层

黄色报错我搞定了 换成const就行了 我是傻*....但是如果输入一个不匹配的书名 会返回一个wrong walue
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

搞定了 谢谢大佬!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 09:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表