2015-07-20 2 views
0

У меня есть вектор нескольких типов данных класса, и я пытаюсь напечатать переменную производного класса.Как получить доступ к переменной в производном классе в C++?

Вот диаграмма классов

enter image description here

Я внедривших диаграмма. Я пытаюсь напечатать оценку из класса присваивания в классе классификации.

Ошибка в другом ostream < (ostream & ОС, Const Курсовая & дт) функции & оператор <.

Вот мои классы

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 
#include <iterator> 
#include <iomanip> 
using namespace std; 


/* -------------------------------------------------------- */ 
/* ---------------------- Grading Class ------------------- */ 
/* -------------------------------------------------------- */ 
class Grading 
{ 
public: 
    string name; 
    int percent; 

    void get_raw_score(); 
    void get_adj_score(); 
}; 

/* -------------------------------------------------------- */ 
/* ---------------------- Assignment Class ---------------- */ 
/* -------------------------------------------------------- */ 
class Assignment : public Grading 
{ 
protected: 
    int score; 
}; 

/* -------------------------------------------------------- */ 
/* ---------------------- Exam Class ---------------------- */ 
/* -------------------------------------------------------- */ 
class Exam : public Grading 
{ 
protected: 
    int score; 

    Exam(string n, int g, int s) { 
     name = n; 
     percent = g; 
     score = s; 
    } 
}; 



/* -------------------------------------------------------- */ 
/* ------------------- Project Class ---------------------- */ 
/* -------------------------------------------------------- */ 
class Project : public Assignment 
{ 
public: 

    string letter_grade; 

    Project(string n, int g, string l_g) { 
     name = n; 
     percent = g; 
     letter_grade = l_g; 
    } 
}; 

/* -------------------------------------------------------- */ 
/* ---------------------- Quiz Class ---------------------- */ 
/* -------------------------------------------------------- */ 

class Quiz : public Exam 
{ 
public: 

    string letter_grade; 

    Quiz(string n, int g, string l_g) : Exam(n, g, score) 
    { 
     name = n; 
     percent = g; 
     letter_grade = l_g; 
    } 
}; 

/* -------------------------------------------------------- */ 
/* ---------------------- CourseWork class ---------------- */ 
/* -------------------------------------------------------- */ 

class CourseWork { 

public: 
    CourseWork() {} 

    void push_back(Quiz * a) { 
     work.push_back(a); 
    } 

    void push_back(Exam * a) { 
     work.push_back(a); 
    } 

    void push_back(Project * a) { 
     work.push_back(a); 
    } 

    // print the data and sort by name 
    void sort_name() { 
     for (int i = 0; i < (int)work.size(); i++) 
      cout<< work.at(i)->name <<endl; 
    } 

    void sort_score() { 

    } 

    friend ostream& operator<<(ostream& os, const CourseWork& dt) { 

     cout << "Grading" << std::setw(20) << "Percentage" << std::setw(20) << "Raw-Score" << endl; 
     for (int i = 0; i < (int)dt.work.size(); i++) { 
      // cout << dt.work.at(i)->name << std::setw(20) << dt.work.at(i)->percent << dt.work.at(i)->score <<endl; 

      os << dt.work.at(i)->name << std::setw(20) << dt.work.at(i)->percent << dt.work.at(i)->letter_grade; 
     } 

     return os; 
    } 


private: 
    vector<Grading*> work; 
}; 

/* -------------------------------------------------------- */ 
/* ---------------------- MAIN ---------------------------- */ 
/* -------------------------------------------------------- */ 

int main() { 
    CourseWork c; 

    c.push_back(new Quiz("Quiz", 5, "B-")); 
    c.push_back(new Quiz("Quiz", 5, "C+")); 
    c.push_back(new Quiz("Quiz", 5, "A")); 
    // c.push_back(new Exam("Midterm", 10, 50)); 
    // c.push_back(new Exam("Final", 30, 85.5)); 
    // c.push_back(new Project("Project", 5, "A-")); 
    // c.push_back(new Project("Project", 15, "B-")); 
    // c.push_back(new Project("Project", 15, "B-")); 
    // c.push_back(new Project("Demo", 10, "C")); 

    cout << "** Showing populated data..." << endl; 
    cout << c << endl << endl;; 

    // c.sort_name(); 
    // c.sort_score(); 

    return 0; 
} 
+1

Да, но что это за сообщение об ошибке? – Snappawapa

+0

Ошибка: ни один член с именем 'letter_grade' в 'Grading' – Pete

+1

Это означает, что clas 'Grading' не имеет ничего, называемого' letter_grade', который смотрит на ваш код, является истинным. Вы пытаетесь получить доступ к чему-то в «градуировке», которой нет. – Snappawapa

ответ

1

Вы храните Grading* объекты в CourseWork объекта:

vector< Grading* > work; 

Таким образом, вы не можете получить доступ к членам производного класса через указатель базового класса. Вы должны ввести новую (чистую) виртуальную функцию в базовом классе, которая должна распечатать параметры производного класса.

class Grading 
{ 
public: 
    virtual ~Grading() {} 

    virtual print() const = 0; 

    // ... 
} 

И вы должны реализовать это во всем своем производном классе.

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

void push_back(Quiz* a) 
{ 
    work.push_back(a); 
} 

void push_back(Exam* a) 
{ 
    work.push_back(a); 
} 

void push_back(Project* a) 
{ 
    work.push_back(a); 
} 

Вам просто нужно одну функцию:

void push_back(Grading* a) 
{ 
    work.push_back(a); 
} 

Или, если вы действительно хотите доступ к членам производных классов, которые вам нужно выполнить. Но вместо этого используйте виртуальные методы.

+0

Благодарим вас за помощь. Это сработало. – Pete

1

Один из способов печати производных классов, чтобы создать функцию с virtual члена в базовом классе Grading, создать переопределение функции члена получают классы, когда это необходимо, и использовать функцию virtual члена в функции, не являющихся членами.

В Grading:

virtual ostream& write(ostream& os) const 
{ 
    return os << this->name << std::setw(20) << this->percent; 
} 

В Project:

virtual ostream& write(ostream& os) const 
{ 
    // Use the immediate base class to call the base 
    // class implementations first. 
    // Then write the data appropriate for this class. 
    return Assignment::write(os) << this->letter_grade; 
} 

Создать функцию, не являющуюся членом для operator<< между std::ostream и Grading.

ostream& operator<<(ostream& os, const Grading& gr) 
{ 
    return gr.write(os); 
} 

Использование выше функции, не являющихся членами из функции, которая выписывает CourseWork.

friend ostream& operator<<(ostream& os, const CourseWork& dt) { 
    os << "Grading" << std::setw(20) << "Percentage" << std::setw(20) << "Raw-Score" << endl; 
    for (int i = 0; i < (int)dt.work.size(); i++) { 
     os << *(dt.work.at(i)) << std::endl; 
    } 
    return os; 
} 
+0

Я не мог заставить этот метод работать, но спасибо за помощь. – Pete

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