1 Востаннє редагувалося Дмитро-Чебурашка (17.04.2019 22:34:01)

Тема: Куди серед файлів додати #include <string>?

Доброго всім вечора!

В мене є файл Untitled1.cpp. У ньому є #include "Base.h". Так от, я засобами codeblocks створюю клас і додаю
і погоджуюся додати в проект. Тобто є Base.h і Base.cpp.  І от, у файлі Untitled1.cpp, перед main () -ом,
і перед цім #include "Base.h" -ем, я додаю

#include <iostream> // std::cout
#include <string> // std::string, std::stoi

#include "Base.h"

це ж нормально? І ось, не компіляется, E:\Code\nasliduvannja\nasliduvannja1\src\Base.cpp|6|error : 'cout' is not a member of 'std'|

Я ніби розумію, це він два обєктні файли спочатку він створює, але мені все ж не зрозуміло, куди ж встромляти інклуди?
Чі або як додавати файли до проекту?

Сервер не зміг зберегти завантажений на форум файл. .rar і .zip.

2

Re: Куди серед файлів додати #include <string>?

Дмитро-Чебурашка написав:

E:\Code\nasliduvannja\nasliduvannja1\src\Base.cpp|6|error : 'cout' is not a member of 'std'|

Весь код в студію!
А також яка у вас ОС, який компілятор (версія) і яким чином виконуєте збірку (в тому числі ключі компіляції).
Забігаючи на перід, такі помилки стаються якщо не правильно зібрати проект або якщо у вас Каель і включені precompiled headers, а ви забули додати

#include "stdafx.h"

.

Подякували: Дмитро-Чебурашка1

3 Востаннє редагувалося wander (17.04.2019 22:34:51)

Re: Куди серед файлів додати #include <string>?

Дмитро-Чебурашка написав:

Я ніби розумію, це він два обєктні файли спочатку він створює, але мені все ж не зрозуміло, куди ж встромляти інклуди?
Чі або як додавати файли до проекту?

Так, так, коли у вас codeblocks можуть бути проблеми з не правильним додаванням файлів до проекту, ось, детально ознайомтесь з матеріалом і зробіть все як вказано там

Прихований текст

обережно російська

Прихований текст
Подякували: Дмитро-Чебурашка1

4 Востаннє редагувалося Дмитро-Чебурашка (17.04.2019 22:47:58)

Re: Куди серед файлів додати #include <string>?

United.cpp

#include <iostream>   // std::cout
#include <string>     // std::string, std::stoi

#include "Base.h"

int main()
{
    Base *PBase = new Base(55);
    _pobats(PBase);
    Base *PNas1 = new Nas1(-64);
    _pobats(PNas1);
    PNas1 = PBase;
    delete PBase;
    _pobats(PNas1);
    delete PNas1;

    return 0;
}

Base.cpp

#include "Base.h"

Base::Base(int _b = 0)
{
    b = _b;//ctor
    std::cout << "Base::Base(int _b) " << this << "  b= " << b << std::endl;
}

Base::~Base()
{
    //dtor
    std::cout << "Base::~Base " << this << "  b= " << b << std::endl;
}

Base::Base(const Base& other)
{
    this-> b = b; //copy ctor
    std::cout << "Base::Base(const Base& other) " << this << "  b= " << b << std::endl;
}

Base& Base::operator=(const Base& rhs)
{
    if (this == &rhs) return *this; // handle self assignment
    //assignment operator
    this-> b = b;
    return *this;
}

Base::virtual void dyvys()
{
    std::cout << "  b= " << b << std::endl;
};

Base::virtual void zminjuj()
{
    std::cout <<  "  vvesty b " << std::endl;
    std::cin >> b;
};


void _pobats(Base &ob)
{
    ob.dyvys();
};

Base.h

class Base
{
    public:
        Base(int b);
        virtual ~Base();
        Base(const Base& other);
        Base& operator=(const Base& other);
        virtual void dyvys();
        virtual void zminjuj();

    protected:
        int b;

    private:

};

#endif // BASE_H

Nas1.h

#ifndef NAS1_H
#define NAS1_H

#include <Base.h>


class Nas1 : public Base
{
    public:
        /** Default constructor */
        Nas1(int _b);
        /** Default destructor */
        virtual ~Nas1();
        /** Copy constructor
         *  \param other Object to copy from
         */
        Nas1(const Nas1& other);
        /** Assignment operator
         *  \param other Object to assign from
         *  \return A reference to this
         */
        Nas1& operator=(const Nas1& other);

        virtual void dyvys();
        virtual void zminjuj();

    protected:
        int b;

    private:
};

#endif // NAS1_H

Nas1.cpp

#include "Nas1.h"

Nas1::Nas1(int _b = 0)
{
    b = _b;//ctor
    std::cout << "Nas1::Nas1(int _b) " << this << "  b= " << b << std::endl;
}

Nas1::~Nas1()
{
    //dtor
    std::cout << "Nas1::~Nas1 " << this << "  b= " << b << std::endl;
}

Nas1::Nas1(const Nas1& other)
{
    //copy ctor
    this-> b = b; //copy ctor
    std::cout << "Nas1::Nas1(const Nas1& other) " << this << "  b= " << b << std::endl;
}

Nas1& Nas1::operator=(const Nas1& rhs)
{
    if (this == &rhs) return *this; // handle self assignment
    //assignment operator
    this-> b = b;
    return *this;
}

Nas1::virtual void dyvys()
{
    std::cout << "  b= " << b << std::endl;
};

Nas1::virtual void zminjuj()
{
    std::cout <<  "  vvesty b " << std::endl;
    std::cin >> b;
};

5 Востаннє редагувалося wander (17.04.2019 23:04:11)

Re: Куди серед файлів додати #include <string>?

_pobats

Так краще не писати це потенційна помилка і вистріл собі в коліно.

Base::virtual void dyvys()

...
Правильно писати так:

void Base::dyvys() override { ... }

Так треба поміняти всюди.

6

Re: Куди серед файлів додати #include <string>?

Прихований текст

Я вас тут на форумі давно знаю. Скажіть, невже дійсно так важко підручник прочитати?

Кожен .cpp-файл компілюється окремо, а .h-файли додаються на місце #include повністю. Таким чином, те, що в одному файлі .cpp написано

#include <iostream>

взагалі ніяк не вплине на компіляцію інших; а якщо це в .h-файлі, то лише тоді, коли цей .h-файл включено.
cout ви використовуєте в Base.cpp та Nas1.cpp, а в United.cpp - ні. Але додаєте iostream лише в United.cpp. Нащо?

Ну і загальна порада - спершу додавайте заголовок цього cpp, потім інші заголовки свого проекту, і лише в кінці - стандартні. Без цього ви ризикуєте іноді отримувати дивні ситуації, коли незначна зміна ламає проект, бо забули якісь заголовки в інших файлах.

7

Re: Куди серед файлів додати #include <string>?

    this-> b = b; //copy ctor

Цікаво, що ви очікували отримати в цьому рядку.