Относительно конструктора по умолчанию инициализация / использование объекта в C ++ ООП - PullRequest
0 голосов
/ 29 июня 2018

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

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Это должно работать, как прокомментировал Холт, вам нужно определить конструктор, вы только что объявили его.

#include <iostream>
#include <string>
#include <list>
using namespace std;
class CStudent {
    string name = "Steve";
    list<int> scores;
    string fn;

public:
    CStudent() {};
    CStudent(string name, string fn);
    string getName();
    double getAverage();
    void addScore(int);
};
string CStudent::getName() {
    return name;
}
double CStudent::getAverage() {
    int av = 0;
    for (auto x = scores.begin(); x != scores.end(); x++) {
        av += *x;
    }

    return av / scores.size();
}
void CStudent::addScore(int sc) {
    scores.push_back(sc);
}

int main()
{
    CStudent stud1;
    cout<< stud1.getName()<< endl;


    return 0;
}
0 голосов
/ 29 июня 2018

Когда вы пишете внутри своего класса:

CStudent();
CStudent(string name, string fn);

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

После их объявления вам необходимо определить их так же, как вы определили методы getName или getAverage:

// Outside of the declaration of the class
CStudent::CStudent() { }

// Use member initializer list if you can
CStudent::CStudent(std::string name, string fn) : 
    name(std::move(name)), fn(std::move(fn)) { }

В C ++ вы также можете определить их при объявлении их внутри класса:

class CStudent {
// ...
public:
    CStudent() { }
    CStudent(std::string name, string fn) : 
        name(std::move(name)), fn(std::move(fn)) { }
// ...
};

Начиная с C ++ 11, вы можете позволить компилятору сгенерировать конструктор по умолчанию для вас:

// Inside the class declaration
CStudent() = default;
...