Error in program. cannot convert from 'char []' to 'char [10]'

Discussion in 'C++' started by GRoll35, Jan 16, 2006.

  1. GRoll35

    GRoll35 Guest

    I get 4 of those errors. in the same spot. I'll show my parent class,
    child class, and my driver.

    All that is suppose to happen is the user enters data and it uses
    parent/child class to display it.

    here is the 4 errors.

    c:\C++\Ch15\Employee.h(29): error C2440: '=' : cannot convert from
    'char []' to 'char [6]'
    c:\C++\Ch15\Employee.h(27): error C2440: '=' : cannot convert from
    'char []' to 'char [21]'
    c:\C++\Ch15\Employee.h(28): error C2440: '=' : cannot convert from
    'char []' to 'char [13]'
    c:\C++\Ch15\Employee.h(30): error C2440: '=' : cannot convert from
    'char []' to 'char [10]'

    this is the part that it don't like in my parent class.

    Employee(char n[21], char s[13], char e[6], char h[10]) //constructor
    {
    name = n;
    ssn = s;
    empNumber = e;
    hire = h;
    }

    Here is my parent class.

    //specification file for the Employee class.
    #ifndef EMPLOYEE_H
    #define EMPLOYEE_H

    class Employee
    {
    private:
    char name[21];
    char ssn[13];
    char empNumber[6];
    char hire[10];
    //char name;
    //char ssn;
    //char empNumber;
    //char hire;
    public:
    //Employee() //default contrusctor
    //{
    // name =' ';
    // ssn =' ';
    // empNumber=' ';
    // hire=' ';
    //}

    Employee(char n[21], char s[13], char e[6], char h[10]) //constructor
    {
    name = n;
    ssn = s;
    empNumber = e;
    hire = h;
    }

    ~Employee() //destructor
    {
    }

    char getName()
    {
    return name[21];
    }
    char getSSN()
    {
    return ssn[13];
    }
    char getEmpNumber()
    {
    return empNumber[6];
    }
    char getHire()
    {
    return hire[10];
    }
    };
    #endif



    **here is my child class

    //specification file for the EmployeePay class
    #ifndef EMPLOYEEPAY_H
    #define EMPLOYEEPAY_H
    #include "Employee.h"

    class EmployeePay: public Employee
    {

    protected:
    float anPay;
    float moPay;
    int depend;
    public:
    //derived class contructor
    EmployeePay(char n, char s, char e, char h, float an, float mo, int
    de) : Employee(n, s, e, h)
    {
    anPay = an;
    moPay = mo;
    depend = de;
    }

    ~EmployeePay() //destructor
    {
    }


    float getAnPay()
    {
    return anPay;
    }
    float getMoPay()
    {
    return moPay;
    }

    int getDepend()
    {
    return depend;
    }

    };
    #endif



    **here is my driver

    //this program gets the info from the parent/child and displays on
    screen
    #include <iostream>
    #include "EmployeePay.h"
    using namespace std;

    int main()
    {
    char userName[21], userSSN[13], userNum[6], userHire[10];
    float userAnPay, userMoPay;
    int userDepends;

    //char name[21];
    //char ssn[13];
    //char empNumber[6];
    //char hire[10];

    //get all the info from the user
    cout <<"Enter the employee's info:\n";
    cout <<"Name: ";
    cin.getline(userName, 21);
    cout << "Social Security Number: ";
    cin.getline(userSSN, 13);
    cout << "Employee Number: ";
    cin.getline(userNum, 6);
    cout <<"Hire Date: ";
    cin.getline(userHire, 10);
    cout << "Annual Pay: ";
    cin >> userAnPay;
    cout << "Monthly Pay: ";
    cin >> userMoPay;
    cout << "Dependents: ";
    cin >> userDepends;

    //define a EmployeePay object and use the data entered by the user
    EmployeePay myEmp(userName[21], userSSN[13], userNum[6], userHire[10],
    userAnPay, userMoPay, userDepends);

    //display the EmployeePay objects properties
    cout << "Here are the Employee's details:\n";
    cout << "Name: " << myEmp.getName() << endl;
    cout << "SSN: " << myEmp.getSSN() << endl;
    cout << "Employee Number: " << myEmp.getEmpNumber() << endl;
    cout << "Hire Date: " << myEmp.getHire() << endl;
    cout << "Annual Pay: " << myEmp.getAnPay() << endl;
    cout << "Montly Pay: " << myEmp.getMoPay() << endl;
    cout << "Dependents: " << myEmp.getDepend() << endl;

    return 0;
    }


    thank you very much for any help!
    GRoll35, Jan 16, 2006
    #1
    1. Advertising

  2. GRoll35 wrote:
    > I get 4 of those errors. in the same spot. I'll show my parent class,
    > child class, and my driver.
    >
    > All that is suppose to happen is the user enters data and it uses
    > parent/child class to display it.
    >
    > here is the 4 errors.
    >
    > c:\C++\Ch15\Employee.h(29): error C2440: '=' : cannot convert from
    > 'char []' to 'char [6]'
    > c:\C++\Ch15\Employee.h(27): error C2440: '=' : cannot convert from
    > 'char []' to 'char [21]'
    > c:\C++\Ch15\Employee.h(28): error C2440: '=' : cannot convert from
    > 'char []' to 'char [13]'
    > c:\C++\Ch15\Employee.h(30): error C2440: '=' : cannot convert from
    > 'char []' to 'char [10]'
    >
    > this is the part that it don't like in my parent class.
    >
    > Employee(char n[21], char s[13], char e[6], char h[10]) //constructor
    > {
    > name = n;


    Arrays are not assignable. Please use 'std::memcpy' or 'std::strcpy', or
    'std::copy'.

    > [..]
    > }
    >
    > Here is my parent class.
    >
    > //specification file for the Employee class.
    > #ifndef EMPLOYEE_H
    > #define EMPLOYEE_H
    >
    > class Employee
    > {
    > private:
    > char name[21];
    > [..]


    V
    Victor Bazarov, Jan 16, 2006
    #2
    1. Advertising

  3. GRoll35

    TB Guest

    GRoll35 sade:
    > I get 4 of those errors. in the same spot. I'll show my parent class,
    > child class, and my driver.
    >
    > All that is suppose to happen is the user enters data and it uses
    > parent/child class to display it.
    >
    > here is the 4 errors.
    >
    > c:\C++\Ch15\Employee.h(29): error C2440: '=' : cannot convert from
    > 'char []' to 'char [6]'
    > c:\C++\Ch15\Employee.h(27): error C2440: '=' : cannot convert from
    > 'char []' to 'char [21]'
    > c:\C++\Ch15\Employee.h(28): error C2440: '=' : cannot convert from
    > 'char []' to 'char [13]'
    > c:\C++\Ch15\Employee.h(30): error C2440: '=' : cannot convert from
    > 'char []' to 'char [10]'
    >
    > this is the part that it don't like in my parent class.
    >
    > Employee(char n[21], char s[13], char e[6], char h[10]) //constructor
    > {
    > name = n;
    > ssn = s;
    > empNumber = e;
    > hire = h;
    > }
    >


    Unless you're a speed-freak, consider using std::string instead,
    that way you won't discriminate people with names longer than
    21 characters ;)

    O, by the way, you can't assign arrays to each other that way,
    you have to copy source array to destination array.

    --
    TB @ SWEDEN
    TB, Jan 16, 2006
    #3
  4. GRoll35

    GRoll35 Guest

    ok that fixed that problem. so now it looks like this..

    Employee(char n[21], char s[13], char e[6], char h[10]) //constructor
    {
    strcpy(name,n);
    strcpy(ssn,s);
    strcpy(empNumber,e);
    strcpy(hire,h);
    }


    but now i get this error...

    c:\C++\Ch15\EmployeePay.h(16): error C2664: 'Employee::Employee(char
    [],char [],char [],char [])' : cannot convert parameter 1 from 'char'
    to 'char []'

    and it points to this part of the code..

    EmployeePay(char n, char s, char e, char h, float an, float mo, int
    de) : Employee(n, s, e, h)
    {
    anPay = an;
    moPay = mo;
    depend = de;
    }

    anyone have any ideas?
    GRoll35, Jan 16, 2006
    #4
  5. GRoll35 wrote:
    > ok that fixed that problem. so now it looks like this..
    >
    > Employee(char n[21], char s[13], char e[6], char h[10]) //constructor
    > {
    > strcpy(name,n);
    > strcpy(ssn,s);
    > strcpy(empNumber,e);
    > strcpy(hire,h);
    > }
    >
    >
    > but now i get this error...
    >
    > c:\C++\Ch15\EmployeePay.h(16): error C2664: 'Employee::Employee(char
    > [],char [],char [],char [])' : cannot convert parameter 1 from 'char'
    > to 'char []'
    >
    > and it points to this part of the code..
    >
    > EmployeePay(char n, char s, char e, char h, float an, float mo, int


    Do you think the types of 'n', 's', 'e', etc. , should be the same or
    different from the types of the corresponding arguments in 'Employee'
    constructor?

    > de) : Employee(n, s, e, h)
    > {
    > anPay = an;
    > moPay = mo;
    > depend = de;
    > }
    >
    > anyone have any ideas?
    >


    V
    Victor Bazarov, Jan 16, 2006
    #5
  6. GRoll35

    Default User Guest

    GRoll35 wrote:

    > ok that fixed that problem. so now it looks like this..
    >
    > Employee(char n[21], char s[13], char e[6], char h[10])
    > //constructor {


    There's no point in the dimensions in the parameters. You can't pass
    arrays, they are converted to pointers to the first element. So:

    Employee(char* n, char* s], char* e, char* h)

    would be clearer.

    > strcpy(name,n);
    > strcpy(ssn,s);
    > strcpy(empNumber,e);
    > strcpy(hire,h);
    > }
    >
    >
    > but now i get this error...
    >
    > c:\C++\Ch15\EmployeePay.h(16): error C2664: 'Employee::Employee(char
    > [],char [],char [],char [])' : cannot convert parameter 1 from 'char'
    > to 'char []'
    >
    > and it points to this part of the code..
    >
    > EmployeePay(char n, char s, char e, char h, float an, float mo, int
    > de) : Employee(n, s, e, h)


    That's pretty obvious, isn't it? n, s, e, and h are of type char, not
    char pointers, yet you send them off to the base constructor.

    > anyone have any ideas?


    I would strongly recommend that you stop mucking around with arrays.
    Your knowledge is sketchy at this point and arrays are tough nuts prone
    to error. For instance, you are using strcpy() without any protection
    for array overflow. As I explained above, the dimensions in the
    declaration are meaningless.

    I would suggest that you use standard containers like std::string at
    this stage.



    Brian

    --
    Please quote enough of the previous message for context. To do so from
    Google, click "show options" and use the Reply shown in the expanded
    header.
    Default User, Jan 16, 2006
    #6
  7. GRoll35 wrote:
    > ok that fixed that problem. so now it looks like this..
    >
    > Employee(char n[21], char s[13], char e[6], char h[10]) //constructor
    > {
    > strcpy(name,n);
    > strcpy(ssn,s);
    > strcpy(empNumber,e);
    > strcpy(hire,h);
    > }
    >
    >
    > but now i get this error...
    >
    > c:\C++\Ch15\EmployeePay.h(16): error C2664: 'Employee::Employee(char
    > [],char [],char [],char [])' : cannot convert parameter 1 from 'char'
    > to 'char []'
    >
    > and it points to this part of the code..
    >
    > EmployeePay(char n, char s, char e, char h, float an, float mo, int
    > de) : Employee(n, s, e, h)
    > {
    > anPay = an;
    > moPay = mo;
    > depend = de;
    > }
    >
    > anyone have any ideas?


    I have several ideas, actually. First, compared to many compiler
    errors, the above error is remarkably clear and concise: error C2664:
    'Employee::Employee(char [],char [],char [],char [])' : cannot convert
    parameter 1 from 'char' to 'char []'

    In other words, the first parameter is supposed to be a char[] - that
    is, an array of characters - but you have passed it a char. An array
    of chars is a different type than a char. So which is it?

    Second, having a constructor that takes seven arguments is strong
    evidence of poor design - the chances of mixing up the order of your
    arguments, leading to a very difficult-to-find error, is very high.

    Third, as someone else already suggested, you need to stop using
    character arrays and start using std::strings, or you are going to
    drive yourself nuts. C++ has excellent library facilities. Your life
    will be much easier if you use them.

    Best regards,

    Tom
    Thomas Tutone, Jan 16, 2006
    #7
  8. GRoll35

    GRoll35 Guest

    do you mean do something like this?

    EmployeePay(char n[21], char s[13], char e[6], char h[10], float an,
    float mo, int de) : Employee(n[21], s[13], e[6], h[10])
    {
    anPay = an;
    moPay = mo;
    depend = de;
    }


    i guess i'm not getting what you trying to say. i do that and i get 2
    more errors. i'll show the errors then the line of code that goes with
    them. did i change what you told me to change or am i still missing
    something? thank you for your help!

    c:\C++\Ch15\Driver.cpp(30): error C2664: 'EmployeePay::EmployeePay(char
    [],char [],char [],char [],float,float,int)' : cannot convert parameter
    1 from 'char' to 'char []'

    EmployeePay(char n[21], char s[13], char e[6], char h[10], float an,
    float mo, int de) : Employee(n[21], s[13], e[6], h[10])
    {
    anPay = an;
    moPay = mo;
    depend = de;
    }

    c:\C++\Ch15\EmployeePay.h(16): error C2664: 'Employee::Employee(char
    [],char [],char [],char [])' : cannot convert parameter 1 from 'char'
    to 'char []'

    EmployeePay myEmp(userName[21], userSSN[13], userNum[6], userHire[10],
    userAnPay, userMoPay, userDepends);
    GRoll35, Jan 16, 2006
    #8
  9. GRoll35 wrote:
    > do you mean do something like this?
    >
    > EmployeePay(char n[21], char s[13], char e[6], char h[10], float an,
    > float mo, int de) : Employee(n[21], s[13], e[6], h[10])


    Close. You've gone too far. Whatever follows the colon is the
    initialiser list. It contains, essentially, function calls. When you
    call a function, and want to pass an array, you're not supposed to write
    the "[21]" (or whatever) after it. If you do, you'll be _dereferencing_
    the pointer (indexing the array) and that's something other than what
    you're trying to achieve.

    > {
    > anPay = an;
    > moPay = mo;
    > depend = de;
    > }
    >
    >
    > i guess i'm not getting what you trying to say. [...]


    Are you going to ask us about every compiler error you're getting? I am
    not opposed asking newbie questions, but come on! Make an effort to
    understand what your compiler is telling you. How much hand-holding from
    the Internet community do you really expect while trying to learn
    a programming language? What book are you using to learn C++?

    V
    Victor Bazarov, Jan 16, 2006
    #9
  10. GRoll35

    GRoll35 Guest

    i understand 100% that i need to stay away from them char arrays.
    but.. in my assigment this is what it asks for the user input.

    Employee Name (i guess I could do string there and have them enter
    first name, then last name, then concat them.

    Social security number, in the format XXX-XX-XXXX where X is a digit
    within the range 0-9

    Employee number, in the format XXX-L, where each X is a digit within
    the range 0-9, and L is a letter within the range A-M.

    Hire Date (01/01/86)

    What ways could I do the ssn, emp number, and hire date so its not a
    char. if i need it to be formatted like that wouldnt i need it? thanks
    guys for putting up with me. I am very new to this and this is all
    stuff I need to learn. I appreciate everyone helping.
    GRoll35, Jan 16, 2006
    #10
  11. GRoll35

    Default User Guest

    GRoll35 wrote:

    > i understand 100% that i need to stay away from them char arrays.
    > but.. in my assigment this is what it asks for the user input.
    >
    > Employee Name (i guess I could do string there and have them enter
    > first name, then last name, then concat them.


    Yes, and that's easy to do with std::string.

    > Social security number, in the format XXX-XX-XXXX where X is a digit
    > within the range 0-9


    That would be a string again, and you need to check the validity of the
    individual characters. That's easy.

    > Employee number, in the format XXX-L, where each X is a digit within
    > the range 0-9, and L is a letter within the range A-M.


    Similar.

    > Hire Date (01/01/86)


    This is trickier, I personally wouldn't want to store the date as a
    string, but your requirements may determine that.

    > What ways could I do the ssn, emp number, and hire date so its not a
    > char. if i need it to be formatted like that wouldnt i need it? thanks
    > guys for putting up with me. I am very new to this and this is all
    > stuff I need to learn. I appreciate everyone helping.


    I'm not sure what you are asking. Do you mean for storage or for the
    user interface?



    Brian

    --
    Please quote enough of the previous message for context. To do so from
    Google, click "show options" and use the Reply shown in the expanded
    header.
    Default User, Jan 16, 2006
    #11
  12. GRoll35 wrote:
    > Employee Name (i guess I could do string there and have them enter
    > first name, then last name, then concat them.
    >
    > Social security number, in the format XXX-XX-XXXX where X is a digit
    > within the range 0-9


    'long' and 'unsigned long' have both enough range to represent any SSN as
    a number. You will need to play tricks when outputting the number if you
    want to see the leading 0s and dashes in the proper places.

    > Employee number, in the format XXX-L, where each X is a digit within
    > the range 0-9, and L is a letter within the range A-M.


    You could pack it in a 'short' or 'unsigned short' value. You could store
    the letter as its (L-'A') value (that's a "minus" in the expression), but
    performing those conversions is sometimes a difficult task for a beginner.

    > Hire Date (01/01/86)


    You could convert it into a 'time_t' type using 'mktime' function, but
    you're probably better off packing another 'unsigned long' with exact day,
    month, and year. Again, packing and unpacking can be daunting, so store
    strings for now (until the requirement is to verify the validity of user
    input).

    > What ways could I do the ssn, emp number, and hire date so its not a
    > char.


    See above.

    > if i need it to be formatted like that wouldnt i need it?


    Sorry, I don't understand the question.

    > thanks
    > guys for putting up with me. I am very new to this and this is all
    > stuff I need to learn. I appreciate everyone helping.


    I think you should take it slowly and go over what you're doing again,
    without our help. That way more will settle in your memory.

    V
    Victor Bazarov, Jan 16, 2006
    #12
  13. GRoll35

    Shark Guest

    > char n[21]

    O'Reilly sells a book called the C++ Pocket Reference for $9.95. It
    says on page 21: "When defining a function that has an array as a
    parameter, all but the first dimension must be specified for the
    parameter".

    In short, instead of char n[21] you have to pass char n[].

    Next thing, when you pass an object by value the copy constructor of
    that object is called implicitly. In your case a char n[21] doesn't
    have a copy constructor (ok, i'm abstracting the abstraction), so it
    doesn't fit in with the function calling convention. Blah!

    Also, there is deep copy vs. shallow copy which you need to keep in
    mind when making copies of arrays (using copy constructors specially)
    from your class.
    Shark, Jan 16, 2006
    #13
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Brad Moore
    Replies:
    5
    Views:
    5,988
    John Harrison
    Oct 13, 2004
  2. Alfonso Morra
    Replies:
    3
    Views:
    1,780
    Christopher Benson-Manica
    Aug 12, 2005
  3. John Smith
    Replies:
    6
    Views:
    5,325
    Mike Wahler
    Oct 31, 2005
  4. GRoll35
    Replies:
    7
    Views:
    1,591
    John Harrison
    Nov 21, 2005
  5. kaizen
    Replies:
    3
    Views:
    4,687
    Jim Langston
    Jan 21, 2006
Loading...

Share This Page