2016-08-03 2 views
2

Я пытаюсь создать программу, которая использует класс, массивы и функции для отображения информации о двух учениках (имя, идентификатор #, зарегистрированные классы). Часть, с которой я борюсь, передаёт массивы функции. Как мне это сделать?Передача массива строк функции

#include <string> 
#include <iostream> 
#include <iomanip> 
using namespace std; 

class Student // Student class declaration. 
{ 
private: 
    string name; 
    int id; 
    string classes; 
    int arraySize; 

public: 
    void setName(string n) 
    { 
    name = n; 
    } 
    void setId(int i) 
    { 
    id = i; 
    } 
    void setClasses(string c, int num) 
    { 
    classes = c; 
    arraySize = num; 
    } 
    string getName() 
    { 
    return name; 
    } 
    int getId() 
    { 
    return id; 
    } 
    void getClasses() 
    { 
    for (int counter=0; counter <arraySize; counter++) { 

     cout << classes[counter] << endl; 
    } 

    } 

}; 

int main() 
{ 
    //Student 1 
    string s1Name = "John Doe"; 
    int s1Id = 51090210; 
    int const NUMCLASSES1 = 3; 
    string s1Classes[NUMCLASSES1] = {"C++","Intro to Theatre","Stagecraft"}; 
    //Student 2 
    string s2Name = "Rick Harambe Sanchez"; 
    int s2Id = 666123420; 
    int const NUMCLASSES2 = 2; 
    string s2Classes[NUMCLASSES2] = {"Intro to Rocket Science","Intermediate Acting"}; 
    // 

    Student info; 

    info.setName(s1Name); 
    info.setId(s1Id); 
    //info.setClasses(s1Classes, NUMCLASSES1); 
    cout << "Here is Student #1's information:\n"; 
    cout << "Name: " << info.getName() << endl; 
    cout << "ID: " << info.getId() << endl; 
    //cout << "Classes: " << info.getClasses() << endl; 


    info.setName(s2Name); 
    info.setId(s2Id); 
    // info.setClasses(s2Classes, NUMCLASSES1); 
    cout << "\n\nHere is student #2's information:\n"; 
    cout << "Name: " << info.getName() << endl; 
    cout << "ID: " << info.getId() << endl; 
    //cout << "Classes: " << info.getClasses() << endl; 



    return 0; 
} 
+2

Как новичок, предпочитают 'зЬй: .vector' сырьевым массивов. Передача 'std :: vector' такая же, как передача строки' int' или 'std :: string'. –

+0

Где в этом коде вы пытаетесь передать массивы в функции? Вы можете передать указатель, но затем вы также должны передать длину. Вместо этого вы можете использовать 'std :: array' или' vector', как и многие другие. –

ответ

0

В частных переменных класса Student, вы сохраняете строку: String classes; , где, как вы должны хранить массив строк, как: String classes[MAX_NUM_CLASSES];

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

void setClasses(string[] c, int num) 

{ 

classes = c; //not sure if simply setting them equal will work, rather copy entire array using a for loop 

arraySize = num; 

} 

Это должно направить вас в правильном направлении

Кроме того, используйте std::vector вместо string[], это будет проще.

0

Вы можете передать массив any_data_type в function как этот

void foo(data_type arr[]); 

foo(arr); // If you just want to use the value of array 
foo(&arr); // If you want to alter the value of array. 
0

Обычный способ передачи вокруг списков переменной длины в C++ является использование std::vector. A vector - это единственный объект, который вы можете легко перейти к функции, скопировав (или ссылаясь) на ее содержимое. Если вы знакомы с Java, это в основном ArrayList. Вот пример:

#include <vector> 
#include <string> 
using namespace std; 

class foo { 
private: 
    vector<string> myStrings; 

public: 
    void setMyStrings(vector<string> vec) { 
    myStrings = vec; 
    } 
} 

//... 

foo myObj; 
vector<string> list = {"foo","bar","baz"}; 
myObj.setMyStrings(list); 

Если не хотите использовать стандартную библиотеку, хотя, вы можете передать C-стиль массива. Это включает в себя передачу указателя на первый элемент массива и длину массива. Пример:

void processStrings(string* arr, int len) { 
    for (int i = 0; i < len; i++) { 
    string str = arr[i]; 
    //... 
    } 
} 

string array[] = {"foo","bar","baz"}; 
processStrings(array, 3); // you could also replace 3 with sizeof(array) 

Передача сырых массивов, как это, особенно если вы хотите, чтобы затем скопировать массив в объект, может быть болезненным. Необработанные массивы in C & C++ - это просто указатели на первый элемент списка. В отличие от языков, таких как Java и JavaScript, они не отслеживают их длину, и вы не можете просто назначить один массив другому. std::vector инкапсулирует концепцию «списка вещей» и, как правило, более интуитивно понятен для использования с этой целью.

Life lesson: use std :: vector.

EDIT: см. Ответ @ nathanesau для примера использования конструкторов для более чистой инициализации объектов. (Но не копируйте-вставьте, напишите сами! Вы узнаете намного быстрее.)

0

Использование std::vector. Кроме того, не добавляйте функции, которые вам не нужны. Вот пример использования std::vector

#include <string> 
#include <iostream> 
#include <vector> 

using std::string; 
using std::vector; 

class Student // Student class declaration. 
{ 
private: 

    vector<string> classes; 
    string name; 
    int id; 

public: 

    Student (const vector<string> &classesUse, string nameUse, int idUse) : 
     classes (classesUse), 
     name (nameUse), 
     id  (idUse) 
    { 
    } 

    void print() 
    { 
     std::cout << "Name: " << name << std::endl; 
     std::cout << "Id:  " << id << std::endl; 
     std::cout << "Classes: "; 

     for (int i = 0; i < classes.size(); i++) 
     { 
      if (i < classes.size() - 1) 
      { 
       std::cout << classes[i] << ", "; 
      } 
      else 
      { 
       std::cout << classes[i] << std::endl; 
      } 
     } 

     std::cout << std::endl; 
    } 
}; 

int main() 
{ 
    Student John ({"C++","Intro to Theatre","Stagecraft"}, 
        "John", 
        51090210); 

    John.print(); 

    Student Rick ({"Intro to Rocket Science","Intermediate Acting"}, 
        "Rick", 
        666123420); 

    Rick.print(); 

    return 0; 
} 


Name: John 
Id:  51090210 
Classes: C++, Intro to Theatre, Stagecraft 

Name: Rick 
Id:  666123420 
Classes: Intro to Rocket Science, Intermediate Acting 
Смежные вопросы