Урок 11 подолжение изучения классов С++, не работает финальная стадия кода.

Доброго времени суток, прошу о помощи.
Только начал осваивать С++, посему прошу простить наивные предположения и ошибки.
В работе используется Dev-C++ 5.4.2
Во время самообучения по урокам «упёрся лбом в стенку», выглядит она так:

C:\Users\BEEF~1\AppData\Local\Temp\ccefIBPc.o   In function `main':


G:\Proj\main.cpp    undefined reference to `Students::Students(std::string, std::string)'

И так со всеми переменными. Они просто не обнаружены, в чём может быть проблема?

Если вывод не верный, то поправьте , пожалуйста.

Код

//main.cpp
    #include <iostream>
    #include "students.h"

    int main(int argc, char *argv[])
    { 
        std::string name;
        std::string last_name;

        std::cout << "Name: ";
        getline(std::cin, name);

        std::cout << "Last name: ";
        getline(std::cin, last_name);

        Students *student = new Students(name, last_name);

        int scores[5];
        int sum = 0;

        for (int i=0; i< 5; ++i) 
        {
        std::cout << "Score " << i+1 << " : " ;
        std::cin >> scores [i];
        sum += scores[i];
        }

        student->set_scores(scores);

        float average_ball = sum / 5.0;

        student -> set_average_ball(average_ball);

        std::cout << "Average ball for" << student->get_name() << " " << student -> get_last_name() << " is " << student ->  get_average_ball () << std::endl;

        delete student;
        return 0;  
    }



// students.h

#pragma once
#include <string>


class Students 
{
public:
    void save();
     ~Students();
     Students(std::string, std::string);
     void set_name(std::string);
     std::string get_name();
     void set_last_name( std::string );
     std::string get_last_name();
     void set_scores(int []);
     int *get_scores();
     std::string get_scores_str(char);
     void set_average_ball(float);
     float get_average_ball();
private:
    int scores[5];
    float average_ball;
    std::string name;
    std::string last_name;

};

//students.cpp
#include <string>
#include <fstream>
#include "students.h"

Students::~Students()
{
    Students::save();
}

void Students::save();
{
    std::ofstream fout("students.txt", std::ios::app);
    fout << Students::get_name() << " " 
         << Students::get_last_name()<< " ";
    for (int i=0; i<5;++i)
    {
        fout << Students::scores[i] << " ";
    }

    fout << std::endl;
    fout.close();
}

Students::Students(std::string name; std::string last_name)
{
    Students::set_name(name);
    Students::set_last_name(last_name);
}

void Students::set_name(std::string student_name)
{
    Students::name = student_name;
}

std::string Students::get_name();
{
    return Students::name;
}

void Students::set_scores(int scores[])
{
    int sum = 0;
    for(int i = 0; i< 5; ++i)
    {
        Students::scores[i] = scores [i];
        sum += scores[i];
    }
}

int *Students::get_scores()
{
    return Students::scores;
}

void Students::get_average_ball()
{
    return Students::average_ball;
}

У тебя в проект (в Dev-C++) включён файл students.cpp? Или ты компилируешь только main.cpp?

Cranium
Да, включен.
У меня тоже создалось впечатление, будто один из «студентов» не подключен и\или не активируется.

М-да... я что-то поспешил. У тебя в коде полно ошибок. И компилятор тебе о них сообщил. А ты — нет.

void Students::save();         // <-- здесь ; не ставится
{
    std::ofstream fout("students.txt", std::ios::app);
    fout << Students::get_name() << " " 
         << Students::get_last_name()<< " ";

// ...

std::string Students::get_name();     // <-- и здесь тоже
{
    return Students::name;
}

Кроме того, нет определений методов Students::set_average_ball(float), Students::get_last_name() и Students::set_last_name(std::string). Объявления в классе есть, а реализации нет.

А с точки зрения ООП, за такой код надо руки отрезать.

Cranium
За руки «отрезать», спасибо, конечно — они мне ещё нужны =) ( простите за демагогию ).

Ошибки:
1. Все файлы не были собраны в проект: из-за этого они не видели друг-друга.
2. Фрагменты кода были упущены и при внимательном рассмотрении дописаны и добавлены.
3. Нет вывода текстового файла.

Решения:
1. ВСЕГДА создавать всё в проекте и кодить.
2. Протирать почаще глаза и не торопиться.
3. В процессе решения.

Спасибо.

За руки «отрезать», спасибо, конечно — они мне ещё нужны =)

Это я не к тому, что бы просто йадом плюнуть, а к тому, что бы ты почитал что-нибудь про идеологию ООП. Хотя бы в Википедии. В данном конкретном примере абстракция и инкапсуляция просто тихо в ауте.

Cranium

Ещё раз обращу внимание : я — начинающий и с кодом познакомился буквально в прошлую пятницу.
Теория — окей.
Три основных и главных постулата : инкапсуляция, наследование и полиморфизм для С++, которые выделяет большинство сторонних источников именно для этого кода.
Код — код переписан с урока № 11.
Я в нём ничего не менял.

R.ion, если ты с прошлой пятницы дошёл до изучения классов и ООП, то это уже очень здорово. Я просто хотел намекнуть, что инструмент классов в С++, с точки зрения ООП, должен применяться по-другому. И что код в 11-ом уроке, опять-таки с точки зрения ООП, мягко говоря, не идеален. В статье рассмотрен только синтаксис. В уроках на этом ресурсе нет статей по проектированию программ в духе ООП. Поэтому нужно будет искать информацию в других источниках.

Код — код переписан с урока № 11.
Я в нём ничего не менял.

Неправильно переписан. Будьте внимательнее.

Cranium
Понял, спасибо.
selevit
Да, там были проблемы, они исправлены и код работает полноценно, как и описано в уроке.
Благодарю.

И что код в 11-ом уроке, опять-таки с точки зрения ООП, мягко говоря, не идеален.

Тут ты полностью прав.
Если хочешь, можешь переделать урок, а я обновлю его на сайте :)

У-у-у... Так там ещё и 10-й урок переписывать придётся. А потом дописывать 12-й, а, возможно, и 15-й.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.