Форум для программистов - задавайте интересные вопросы - получайте квалифицированные ответы
Вынести классы в отдельные файлы
  • KTihonovKTihonov June 2011
    Помогите, плиз... Сейчас программа выглядит так:

    Код:

    #include virtual.h

    class One
    {
    public:
    One(){};
    virtual ~One();
    virtual void TellMe()=0;
    protected:

    private:

    };

    class Two: public One
    {
    public:
    ~Two();
    virtual void TellMe();
    protected:

    private:

    };

    class Three: public One
    {
    public:
    ~Three();

    protected:
    virtual void TellMe();

    private:

    };

    Код:

    //virtual.cpp

    #include "stdafx.h"
    #include
    #include ".h"

    using namespace std;

    One::~One()
    {
    cout << "!!!" << endl;<br />}

    Two::~Two()
    {
    cout << "Two::destructor" << endl;<br />}

    void Two::TellMe()
    {
    cout << "Two::TellMe" << endl;<br />}

    Three::~Three()
    {
    cout << "Three::destructor" << endl;<br />}

    void Three::TellMe()
    {
    cout << "Three::TellMe" << endl;<br />}

    int _tmain(int argc, _TCHAR* argv[])
    {
    const int size=10;
    One* arrey[size];
    for(int i=0; i {
    arrey[i]=new Two;
    arrey[i+1]=new Three;
    }

    Three* temp;
    for(int i=0; i {

    //temp = dynamic_cast(arrey[i]);
    //if(temp!=NULL)
    //{
    // cout << "Three object...\n";<br /> // temp->TellMe();
    //}

    arrey[i]->TellMe();
    }

    cout << endl;<br />
    for(int i=0; i {
    delete arrey[i];
    }

    cout << endl;<br />
    int y;
    cin >> y;
    return 0;
    }

    Хочу выделить классы в отдельные файлы, но что-то не получается (лезут непонятные ошибки)... Делаю так:

    Код:

    //One.h

    class One
    {
    public:
    One(){};
    virtual ~One();
    virtual void TellMe()=0;
    protected:

    private:

    };

    Код:

    //One.cpp

    #include
    #include "One.h"

    using namespace std;

    One::~One()
    {
    cout << "!!!" << endl;<br />}

    Код:

    //Two.h

    #include "One.h"

    class Two: public One
    {
    public:
    ~Two();
    virtual void TellMe();
    protected:

    private:

    };

    Код:

    //Two.cpp

    #include
    #include "Two.h"

    using namespace std;

    Two::~Two()
    {
    cout << "Two::destructor" << endl;<br />}

    void Two::TellMe()
    {
    cout << "Two::TellMe" << endl;<br />}

    Код:

    //Three.h

    #include "One.h"

    class Three: public One
    {
    public:
    ~Three();
    virtual void TellMe();

    protected:

    private:

    };

    Код:

    //Three.cpp

    #include
    #include "Three.h"

    using namespace std;

    Three::~Three()
    {
    cout << "Three::destructor" << endl;<br />}

    void Three::TellMe()
    {
    cout << "Three::TellMe" << endl;<br />}

    Код:

    //virtual.cpp

    #include "stdafx.h"
    #include
    #include "One.h"
    #include "Two.h"
    #include "Three.h"

    using namespace std;

    int _tmain(int argc, _TCHAR* argv[])
    {
    const int size=10;
    One* arrey[size];
    for(int i=0; i {
    arrey[i]=new Two;
    arrey[i+1]=new Three;
    }

    //Three* temp;
    for(int i=0; i {
    //temp = dynamic_cast(arrey[i]);
    //if(temp!=NULL)
    //{
    // cout << "Three object...\n";<br /> // temp->TellMe();
    //}

    arrey[i]->TellMe();
    }

    cout << endl;<br />
    for(int i=0; i {
    delete arrey[i];
    }

    cout << endl;<br />
    int y;
    cin >> y;
    return 0;
    }

    Хотелось бы узнать: что я делаю не так?

    P.S: Использую Visual Studio 2010.
  • plexTORplexTOR June 2011
    В .h файлах других классов не используйте #include
    Код:

    //Three.h

    #include "One.h"

    вместо этой жести используйте следующее:
    Код:

    //Three.h

    class One;

    так же с другими классами. (кроме One естественно).

    Можно еще сделать организацию хидеров так -
    Код:

    #ifndef название_хидера
    #define название_хидера

    здесь объявления

    #endif

    если в винде, то можно просто в начале файла так
    #pragma once
  • KTihonovKTihonov June 2011
    OK, заменил, но прога все равно не компилится... Ругань следующая:
    1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\sysfiles\sysfiles\two.cpp(2): warning C4627: '#include ': skipped when looking for precompiled header use
    1> Add directive to 'StdAfx.h' or rebuild precompiled header
    1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\sysfiles\sysfiles\two.cpp(3): warning C4627: '#include "Two.h"': skipped when looking for precompiled header use
    1> Add directive to 'StdAfx.h' or rebuild precompiled header
    1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\sysfiles\sysfiles\two.cpp(16): fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "StdAfx.h"' to your source?
    1> Three.cpp
    1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\sysfiles\sysfiles\three.cpp(2): warning C4627: '#include ': skipped when looking for precompiled header use
    1> Add directive to 'StdAfx.h' or rebuild precompiled header
    1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\sysfiles\sysfiles\three.cpp(3): warning C4627: '#include "Three.h"': skipped when looking for precompiled header use
    1> Add directive to 'StdAfx.h' or rebuild precompiled header
    1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\sysfiles\sysfiles\three.cpp(16): fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "StdAfx.h"' to your source?
    1> One.cpp
    1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\sysfiles\sysfiles\one.cpp(2): warning C4627: '#include ': skipped when looking for precompiled header use
    1> Add directive to 'StdAfx.h' or rebuild precompiled header
    1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\sysfiles\sysfiles\one.cpp(3): warning C4627: '#include "One.h"': skipped when looking for precompiled header use
    1> Add directive to 'StdAfx.h' or rebuild precompiled header
    1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\sysfiles\sysfiles\one.cpp(11): fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "StdAfx.h"' to your source?

    Просто ради эксперимента попробовал добавить в файлы One.cpp, Two.cpp и Three.cpp строку #include "StdAfx.h. После этого ругань стала другой:
    1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\sysfiles\sysfiles\two.h(4): error C2504: 'One' : base class undefined
    1> Three.cpp
    1>c:\documents and settings\admin\мои документы\visual studio 2010\projects\sysfiles\sysfiles\three.h(4): error C2504: 'One' : base class undefined
  • plexTORplexTOR June 2011
    заинклюдь свои дела в StdAfx.h
    и оформи их как я писал выше.
    и включая в программу заместо них StdAfx.h
    это чисто мс фича, называется прекомпелируемые хидеры.
    можно их отключить в параметрах проекта.
  • KTihonovKTihonov June 2011
    OK, все получилось. Огромное СПАСИБО за помощь!

    P.S: Файлы iostream, One.h, Two.h и Three.h я заинклюдил в файле StdAfx.h. Из своих cpp-файлов я эти инклюды убрал, заменив их во всех этих файлах на инклюд StdAfx.h.
Webparadox - разработка мобильных приложений под iOS и Android.