【问题标题】:C++ - class issueC++ - 类问题
【发布时间】:2011-06-13 16:33:09
【问题描述】:

在:http://www.learncpp.com/cpp-tutorial/82-classes-and-class-members/

有以下程序(我做了一些小修改):

#include <iostream>

class Employee
{
public:
    char m_strName[25];
    int m_id;
    double m_wage;

    //set the employee information
    void setInfo(char *strName,int id,double wage)
    {
        strncpy(m_strName,strName,25);
        m_id=id;
        m_wage=wage;
    }

    //print employee information to the screen
    void print()
    {
        std::cout<<"Name: "<<m_strName<<"id: "<<m_id<<"wage: $"<<wage<<std::endl;
    }
};

int main()
{
    //declare employee
    Employee abder;
    abder.setInfo("Abder-Rahman",123,400);
    abder.print();
    return 0;
}

当我尝试编译它时,我得到以下信息:

还有,为什么这里使用指针? void setInfo(char *strName,int id,double wage)

谢谢。

【问题讨论】:

    标签: c++ class pointers


    【解决方案1】:

    您必须包含声明strncpy 函数的标头。所以添加

    #include <cstring> 
    

    在开头。

    成员名称是m_wage,但您在print 成员函数中将其用作wage

    改变

    std::cout<<"Name: "<<m_strName<<"id: "<<m_id<<"wage: $"<<wage<<std::endl;
    

    std::cout<<"Name: "<<m_strName<<"id: "<<m_id<<"wage: $"<<m_wage<<std::endl;
                                                             ^^^^^^
    

    【讨论】:

      【解决方案2】:

      1.

      strncpy(m_strName,strName,25);
      

      你需要#include &lt;cstring&gt;(声明strncpy的地方)。

      2.

      std::cout<<"Name: "<<m_strName<<"id: "<<m_id<<"wage: $"<<wage<<std::endl;
      

      应该是

      std::cout<<"Name: "<<m_strName<<"id: "<<m_id<<"wage: $"<<m_wage<<std::endl;
      

      3.

      void setInfo(char *strName,int id,double wage)
      

      可以设置为

      void setInfo(const char *strName,int id,double wage)
      

      摆脱 g++ 4.x.x 警告。

      【讨论】:

      • 感谢您的回复。你是对的,但是,为什么这个警告?而且,为什么我们必须插入“const”来 gt 摆脱它?谢谢。
      • 使用abder.setInfo("Abder-Rahman",123,400);,您传入一个常量字符串,但您将void setInfo(char *strName,int id,double wage) 声明为char *,这向编译器表明您可能希望修改strName。编译器可以看到你不能这样做,所以它试图提供帮助。听取警告;它们几乎总能帮助您编写更健壮的代码。
      【解决方案3】:

      添加

      #include <string.h>
      

      在第 19 行将工资更改为 m_wage。

      【讨论】:

      • 请不要混合 C++ 和 C 头文件。
      【解决方案4】:

      你需要:

      #include <string>
      #include <iostream>
      #include <string.h>
      

      【讨论】:

      • 请不要混合 C++ 和 C 头文件。
      【解决方案5】:

      关于最后一条警告/错误消息 - setInfo() 成员函数的第一个参数应声明为 const char*。普通的char* 表示指向可变 字符数组的指针,而字符串文字"Abder-Rahman" 不是。

      【讨论】:

        【解决方案6】:

        错误是因为在cstring头文件中声明了strncpy。

        使用指针是因为您使用的是 C 字符串,它们是 char 数组。 C 中的数组是通过指针使用的。 strncpy 需要两个指向 char(char arrays) 的指针来执行复制过程。

        【讨论】:

        • "请不要混合 C++ 和 C 头文件。" ——康拉德·鲁道夫 :)
        • 感谢您的回复。当您说:“C 中的数组是通过指针使用的”时,那么 C+= 中的数组是如何使用的呢?谢谢。
        • @SWEngineer 它同样适用于 c++,我想强调与其他语言的区别。
        猜你喜欢
        • 1970-01-01
        • 2011-03-11
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        • 2010-09-10
        • 2010-12-16
        • 1970-01-01
        • 2012-04-03
        相关资源
        最近更新 更多