C++ 에서 클래스 안에 배열에 접근하는 방법


아래는 코드의 일부입니다. 아래 클래스의 값들로부터 평균을 만드는 코드를 추가하려고 합니다. 일단 제가 궁금한 부분은 제목과 같이, 클래스 안의 배열에 접근하는 방법입니다. 예를 들어 'Tom' 이 포함된 첫 번째 배열의 2번째 항목인 '41'에 접근하고자 할때 student0 이라고 하면 되는걸까요? 아니면 어떻게 접근해야 할까요..?

    Student student[10] = {
        Student("Tom", 41, 85, 72), Student("Ami", 38, 80, 69),
        Student("Cathy", 65, 68, 96), Student("Mike", 22, 49, 67),
        Student("John", 51, 61, 63), Student("Alex", 87, 66, 24),
        Student("Alice", 80, 83, 71), Student("Bob", 60, 64, 52),
        Student("Colin", 90, 60, 49), Student("Dave", 31, 23, 99)};

    for(int i=0; i<10; i++) {
        int average[i] = ((student[i][1] + student[i][2] + student[i][3] / 3));
    }

아래는 현재까지 작성한 코드입니다.

class Student {
private:
    char name[15];
    int scnce, eng, math;
    int average;
public:
    Student(char * _name, int _scnce, int _eng, int _math);
    Student();
    void GetAverage();
    void ShowInfo();
   Student::Student(char * _name, int _scnce, int _eng,int _math) 
    : scnce(_scnce), eng(_eng), math(_math) {strcpy_s(name, _name);
}


void Student::GetAverage() {
    for (int i = 0; i<10; i+ +) {
        int average[i] = stu[i]._scnce + stu[i]._eng + stu._math / 3;
    }
}
void Student::ShowInfo() {

    cout << name << "\t" << average << "\t" << scnce << "\t" << eng << "\t" << math << endl;
}

int main() {
    Student stu[] = {
        Student("1.Tom", 41, 85, 72), Student("2.Ami", 38, 80, 69),
        Student("3.Cathy", 65, 68, 96), Student("4.Mike", 22, 49, 67),
        Student("5.John", 51, 61, 63), Student("6.Alex", 87, 66, 24),
        Student("7.Alice", 80, 83, 71), Student("8.Bob", 60, 64, 52),
        Student("9.Colin", 90, 60, 49), Student("10.Dave", 31, 23, 99) };
    cout << "name" << "\t" << "average" << "\t" << "science" << "\t" << "english" << "\t" << "math" << endl;
    for (int i = 0; i<10; i++)
        stu[i].ShowInfo();
    return 0;
}


};

추가질문입니다. name 다음에 ": " 콜론(?) 문자를 부이면 출력결과가 이미지처럼 열이 안 맞고 오른쪽으로 열이 밀리는 건 어떻게 해결할까요.?

이미지

  • 2016년 09월 10일에 작성됨

조회수 186


4 답변


좋아요
1
싫어요
채택취소하기

배열에는 현재 객체들이 들어가있는 상태입니다. 객체에서는 이 값들을 얻을 수 있는 getter가 있어야할겁니다. 필드를 public로 하면 안되겠죠. 다시말해서 클래서에는 int getValue(){ return value;} 같은 함수가 있어야 합니다.

배열의 요소를 접근한다는 것은 다시 말해서 배열에 저장된 객체를 참조한다는 것 입니다. student[1].getValue() 를 통해서 값을 리턴받겠죠?

아니면 평균을 리턴하는 매소드가 있으면 효율면에서 더 이득이 있을겁니다.

만약 자료형만 있는 클래스라면 구조체로 바꾸셔도 무방할겁니다...

  • 2016년 09월 10일에 작성됨

  • 멤버함수로 평균을 가져오는 함수를 만들려고 하는데 그 안에 클래스 객체가 필요한 경우 어떻게 해야할까요? 클래스 객체 선언은 main 함수에서 Student stu= {Student("Kim", 80, 45) , Student("Lee", 50, 65) }; 처럼 코드의 아래 부분에서 할텐데 어찌 해야할까요?    이성우   2016.9.10 21:03     
  • 일단 현재 코드 본문 하단에 추가하였습니다.    이성우   2016.9.10 21:14     

객체에 대해 조금 더 이해가 필요할듯 싶습니다.

각 객체마다 가지는 값은 서로 다릅니다. 학생 클래스마다 갖는 성적이 모두 다르단 말이지요...

선언을 그렇게 하고 있으니까요. 학생클래스가 값을 공유하고 싶다면 static 속성을 줘야합니다

statc string schoolName = "A" 이런 개념에서요

여튼

평균을 반환하는 매소드는 반환값을 int로 하고(필요하면 float) return (scnce+eng+math)/3 이겠습니다.

메인에서는

for (int i = 0; i<10; i++) stu[i].getavg();

이렇게 되겠지요.

  • 2016년 09월 10일에 작성됨

  • 음.. 그러면 메인함수에서 클래스로부터 객체를 만들때 static Student stu[] = {...} 식이 되는건가요..?    이성우   2016.9.10 21:58     

for (int i = 0; i < 10; i++) average = (scnce + math + eng) / 3; 이걸 하신 이유가 무엇이지요?

  • 2016년 09월 11일에 작성됨

  • 명확한 이유는 잘 모르겠습니다. main 함수에서 stu객체를 안의 내용이 각각 처음에 선언한 name, scnce, math , eng 변수 안에 들어갔기 때문? 이라고 보면 되는걸까요    이성우   2016.9.11 10:16     
  • 본인이 짜신거 아닌가요? 명확한 이유를 모르겠다고 하시니;;    PuppyRush   2016.9.11 10:28     
  • 올린 코드의 메인함수에서 ShowInfo와 GetAverage 의 순서를 바꾸니 작동을 하네요!! ShowInfo 안에 average가 포함되는데도 불구하고 뒤에서 호출되서 그랬나봅니다. 제가 입문자다보니 코드가 작동함에 있어 명확한 이유는 잘 모릅니다..ㅠㅠ 확신이 없다해야할지도 모르겠고요.    이성우   2016.9.11 23:01     
  • 그렇군요 가능하면 디버깅 기능을 익혀서 프로그램이 돌아가는 순서와 값을 확인해보는 연습도 좋습니다    PuppyRush   2016.9.12 09:28     
  • 감사합니다. 디버깅 기능도 공부리스트에 올려서 공부해봐야겠군요. ㅎㅎ    이성우   2016.9.12 10:56     

현재 여기서 막혔습니다.. 평균값이 안 되네요 ㅠ

Student::Student(char * _name, int _scnce, int _eng,int _math) 
    : scnce(_scnce), eng(_eng), math(_math) {strcpy_s(name, _name);
}

int Student::GetAverage() {
    for (int i = 0; i < 10; i++)
        average = (scnce + math + eng) / 3;
    return average;
}

void Student::ShowInfo(int num) {

    cout << num << "."<< name << "\t" << average << "\t" << scnce << "\t" << eng << "\t" << math << endl;
}

int main() {
    static Student stu[] = {
        Student("Tom", 41, 85, 72), Student("Ami", 38, 80, 69),
        Student("Cathy", 65, 68, 96), Student("Mike", 22, 49, 67),
        Student("John", 51, 61, 63), Student("Alex", 87, 66, 24),
        Student("Alice", 80, 83, 71), Student("Bob", 60, 64, 52),
        Student("Colin", 90, 60, 49), Student("Dave", 31, 23, 99) };
    cout << "name" << "\t" << "average" << "\t" << "science" << "\t" << "english" << "\t" << "math" << endl;
    for (int i = 0; i < 10; i++) {
        stu[i].ShowInfo(i + 1);
        stu[i].GetAverage();
    }
    return 0;
}

  • 2016년 09월 10일에 작성됨

  • stu[i].ShowInfo( i + 1 ); 에서 아마 오류 날겁니다. 생성자에서 average = (int)(scnce + eng + math)/3; 를 지정해주셔야 ShowInfo를 불러올때 오류가 안날 겁니다. 왜냐하면 average는 GetAverage()함수를 불러올때 초기화가 되기 때문에 ShowInfo(int)를 먼저 사용하면 쓰레기 값이 출렵됩니다.    유현호   2016.9.15 18:35     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close