2011-01-22 3 views
1

В: http://www.learncpp.com/cpp-tutorial/82-classes-and-class-members/C++ - класс выпуск

Существует следующая программа (я сделал некоторые небольшие изменения):

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

Когда я пытаюсь скомпилировать его, я получаю следующее:

alt text

И почему здесь используется указатель? void setInfo(char *strName,int id,double wage)

Спасибо.

+0

Почему нет углублений? –

ответ

1

1.

strncpy(m_strName,strName,25); 

Вы должны #include <cstring> (где объявлен 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) 

, чтобы избавиться от г ++ 4.x.x предупреждения.

+0

Спасибо за ваш ответ. Вы правы, но почему это предупреждение? И почему нам пришлось вставить «const» в gt из него? Благодарю. – Simplicity

+0

С 'abder.setInfo (« Abder-Rahman », 123,400);', вы передаете константу, но вы объявили 'void setInfo (char * strName, int id, double payage)' как 'char *' , который указывает компилятору, что вы, возможно, захотите изменить 'strName'. Компилятор может видеть, что вы не можете этого сделать, поэтому он пытается быть полезным. Слушайте предупреждения; они почти всегда помогают вам писать более надежный код. –

1

Добавить

#include <string.h> 

и изменения заработной платы в m_wage на линии 19.

+0

Пожалуйста, не смешивайте заголовки C++ и C. –

5

Вы должны будете включать заголовок, объявляющий функцию strncpy. Таким образом, добавьте

в начале.

И имя участника m_wage, но вы использовали его как wage в своей функции-члена print.

Изменить

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; 
                 ^^^^^^ 
1

Понадобится:

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

Пожалуйста, не смешивайте заголовки C++ и C. –

1

Что касается сообщения последнего предупреждения/ошибки - первый параметр функции setInfo() члена должны быть объявлены const char*. Plain char* представляет собой указатель на mutable массив символов, в котором строковый литерал "Abder-Rahman" нет.

1

Ошибка в том, что strncpy объявлен в заголовочном файле cstring.

Указатель используется, поскольку вы работаете со строками C, которые являются массивами символов. Массивы в C используются с помощью указателей. И strncpy принимает два указателя на char (массивы символов), чтобы выполнить процесс копирования.

+0

«Пожалуйста, не смешивайте заголовки C++ и C». - Конрад Рудольф :) –

+0

Спасибо за ваш ответ. Когда вы говорите: «Массивы в C используются через указатели», как же тогда массивы используются в C + =? Благодарю. – Simplicity

+0

@SWEngineer Он применяет то же самое к C++, я хотел бы подчеркнуть разницу с другими языками. –

Смежные вопросы