2014-11-09 5 views
0

У меня есть задание на домашнюю работу, но я не понимаю, что не так с моим кодом. Переменная имени перепутана. Я просматриваю свой учебник, и я не вижу ничего плохого в моем коде. Пожалуйста помоги.C++ внутренний класс с неработающими методами

Имя должно храниться в массиве длиной 80, и это был единственный способ, которым я знал, как это сделать.

Я получаю много опыта в java, поэтому не знаю, есть ли синтаксис, который у меня отсутствует или что.

Спасибо за ваше время.

//import statements 
#include <iostream> 
#include <iomanip> 
using namespace std; 

//class declaration section 
class Student 
{ 
    //declare private instance variables 
    private: 
     int ssn; 
     char* name[80]; 
     const int ARRAYLENGTH =80; 

    //deckale public methods and constructor 
    public: 
     Student(); 
     void setName(string); 
     int getSSN(); 
     string getName(); 
     void setSSN(int); 


}; 

//class implementation section 
Student::Student() 
{ 
    //set ssn equal to 99999999 by default 
    ssn = 999999999; 
    //set name equal to unassigned by default 
    string someString ="unassigned"; 
    for(int i = 0; i < ARRAYLENGTH; i++) 
    { 
     if (i < someString.length()) 
      name[i] = &someString[i]; 
     else 
      name[i]= ""; 
    } 
} 

void Student::setName(string newName) 
{ 
    //assigns the newName to the char array 
    for(int i = 0; i < ARRAYLENGTH; i++) 
    { 
     if (i < newName.length()) 
      name[i] = &newName[i]; 
     else 
      name[i]= ""; 
    } 

    return; 
} 

int Student::getSSN() 
{ 
    return ssn; 
} 

string Student::getName() 
{ 
    //make a string from the char array to return a string 
    string name1 = ""; 
    for(int i = 0; i < 80; i++) 
    { 
     name1 += *(name+i); 
    } 
    return name1; 
} 

void Student::setSSN(int num) 
{ 
    //check to make sure ssn isnt below or equal to 0 
    if (num > 0) 
     ssn = num; 

    return; 
} 


//main function 
int main() { 

    Student student1, student2; 

    //changing name and ssn of student2 
    student2.setName("John Doe"); 
    student2.setSSN(123456789); 

    //printing out information 
    cout<< "Name for student1 is "<< student1.getName() <<" and snn is "<< student1.getSSN() <<endl; //name should be unassigned and ssn should be 999999999 
    cout<< "Name for student1 is "<< student2.getName() <<" and snn is "<< student2.getSSN() <<endl; //name should be John Doe and ssn should be 123456789 

    return 0; 

} 
+0

Вы должны инициализировать ваш символ * имя [80], используя новый. Кроме того, в чем причина не использования общего ARRAY_LENGTH в вашем 'char * name [80]'? Вам нужно понять, хотите ли вы, чтобы имя символа [80] 'или имя символа [80] - зависит от вашего рабочего объекта. – ha9u63ar

ответ

2

Некоторые из ошибок, которые я мог указать в одном сканировании являются: -

Это неправильно: -

name[i] = &someString[i]; 

Вы пытаетесь принять адрес определенного символа в строке и затем бросать его на char *.

Затем вы пытаетесь значение магазина в междунар который находится за пределами его диапазона: -

ssn = 999999999; 
2

вы изменяете номер социального страхования от Student2 но вы печатающего номер социального страхования от student1

4

Это char* name[80] объявляет массив указателей. Возможно, вам просто нужен массив символов, используя char name[80]. (Который буквально является указателем на первый символ массива)

char* name[80] - это массив указателей. (Вероятно, не то, что вы намеревались)

+0

Это не указатель на массив. Это массив указателей. – kraskevich

+0

Да, извините, моя ошибка, отредактирует – Grantly

0

Этот код должен решить эту проблему.

//import statements 
#include <iostream> 
#include <iomanip> 
using namespace std; 

//class declaration section 
class Student 
{ 
    //declare private instance variables 
    private: 
     int ssn; 
     char name[80]; 
     const int ARRAYLENGTH =80; 

    //deckale public methods and constructor 
    public: 
     Student(); 
     void setName(string); 
     int getSSN(); 
     string getName(); 
     void setSSN(int); 


}; 

//class implementation section 
Student::Student() 
{ 
    //set ssn equal to 99999999 by default 
    ssn = 999999999; 
    //set name equal to unassigned by default 
    string someString ="unassigned"; 
    for(int i = 0; i < ARRAYLENGTH; i++) 
    { 
     if (i < someString.length()) 
      name[i] = someString[i]; 
     else 
      name[i]= '\0'; 
    } 
} 

void Student::setName(string newName) 
{ 
    //assigns the newName to the char array 
    for(int i = 0; i < ARRAYLENGTH; i++) 
    { 
     if (i < newName.length()) 
      name[i] = newName[i]; 
     else 
      name[i]= '\0'; 
    } 

    return; 
} 

int Student::getSSN() 
{ 
    return ssn; 
} 

string Student::getName() 
{ 
    //make a string from the char array to return a string 
    string name1 = ""; 
    for(int i = 0; i < 80; i++) 
    { 
     name1 += *(name+i); 
    } 
    return name1; 
} 

void Student::setSSN(int num) 
{ 
    //check to make sure ssn isnt below or equal to 0 
    if (num > 0) 
     ssn = num; 

    return; 
} 


//main function 
int main() { 

    Student student1, student2; 

    //changing name and ssn of student2 
    student2.setName("John Doe"); 
    student2.setSSN(123456789); 

    //printing out information 
    cout<< "Name for student1 is "<< student1.getName() <<" and snn is "<< student1.getSSN() <<endl; //name should be unassigned and ssn should be 999999999 
    cout<< "Name for student1 is "<< student2.getName() <<" and snn is "<< student2.getSSN() <<endl; //name should be John Doe and ssn should be 123456789 

    return 0; 

} 
+0

Вы должны использовать 'ARRAYLENGTH' в качестве емкости массива, чтобы избежать возможных различий между значением для ARRAYLENGTH и емкостью массива, например. 'char name [ARRAYLENGTH];'. –

0

Я действительно не думаю, что вы хотите хранить 80 имен, похоже, что у ученика есть только одно имя.

char *name[80] означает 80 имен, а не 80 символов!

В любом случае: вы не можете держать указатель на локальную переменную, вы делаете это во многих местах.

Так что вам лучше использовать const char*, а не по значению string. , например:

изменения string someString ="unassigned"; в const char* someString = "unassigned"

функция Student::setName(string newName) должна быть Student::setName(const char* newName)

Другой вариант заключается в копировании, а не просто присвоить указатель. означает использование string name[80]; вместо char* name[80]; в этом случае: функция Student::setName(string newName) лучше быть Student::setName(const string& newName)

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