Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Помогите, плиз, вынести классы в отдельные файлы. (http://forum.oszone.net/showthread.php?t=177439)

Oleg_SK 05-06-2010 13:52 1427829

Помогите, плиз, вынести классы в отдельные файлы.
 
Сабж. Сейчас программа выглядит так:

Код:

//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 <iostream>
#include "virtual.h"

using namespace std;

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

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

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

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

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

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

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

                arrey[i]->TellMe();
        }
       
        cout << endl;

        for(int i=0; i<size; ++i)
        {
                delete arrey[i];
        }

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

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

Код:

//One.h

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

Код:

//One.cpp

#include <iostream>
#include "One.h"

using namespace std;

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

Код:

//Two.h

#include "One.h"

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

private:

};

Код:

//Two.cpp

#include <iostream>
#include "Two.h"

using namespace std;

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

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

Код:

//Three.h

#include "One.h"

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

private:

};

Код:

//Three.cpp

#include <iostream>
#include "Three.h"

using namespace std;

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

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

Код:

//virtual.cpp

#include "stdafx.h"
#include <iostream>
#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<size; i+=2)
        {
                arrey[i]=new Two;
                arrey[i+1]=new Three;
        }

        //Three* temp;
        for(int i=0; i<size; ++i)
        {
                //(dynamic_cast<Three*>(arrey[i]))->TellMe();

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

        //Three test;
        //test.TellMe();

        cout << endl;

        for(int i=0; i<size; ++i)
        {
                delete arrey[i];
        }

        cout << endl;

        int y;
        cin >> y;
        return 0;
}

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

P.S: Использую Visual Studio 2010.

Oleg_SK 05-06-2010 17:26 1427949

Проблема решена. Для этого потребовалось сделать следующее:
1) В файлах Two.h и Three.h заменил инклюд файла One.h на объявление: class One;
2) Учел особенности работы Visual Studio; проинклюдил все свои заголовочные файлы и файл iostream в файле stdafx.h, а из своих cpp-файлов эти инклюды убрал, заменив на инклюд stdafx.h.

pva 05-06-2010 17:38 1427960

ещё бы хотелось узнать какие именно ошибки лезут. Если о том, что классы уже определены, то:
сборка программы на с/с++ состоит из 3х этапов:
1. препроцессинг,
2. комлиляция
3. связывание (linking).
На певом этапе:
1. весь текст собираемого модуля сливается в один файл (#include) в одну строчку
2. выполняются директивы препроцессора по замене текста #define
3. удаляются комментарии
4. раскрываются так называемые триграфы
5. соединяются строчные константы, разделённые пробелами "sd\nfds" "123" -> "sd<код символа \n>fds123"

допустим есть 3 файла:
Код:

1.h:
int a;

2.h:
#include "1.h"
int b;

3.cpp:
#include "1.h"
#include "2.h"

после препроцессинга 3.cpp вместо #include будет содержимое указанных файлов, т.е.
Код:

int a;
int a;
int b;

такой код не проглотится компилятором, потому что переопределяется переменная a. Чтобы не было таких подвохов, используют хитрость:
Код:

1.h:
#ifndef 1_H
#define 1_H
int a;
#endif

теперь после первого включения 1.h препроцессор запомнит значение 1_H и (следуя инструкции #ifndef) будет в следующий раз пропускать содержимое этого файла.
Сделай то же самое, и у тебя заработает

Oleg_SK 05-06-2010 18:11 1427980

pva
Цитата:

#ifndef 1_H
#define 1_H
int a;
#endif
Благодарю за информацию. На данный момент, я проинклюдил все свои заголовочные файлы в файле stdafx.h, в котором первой же инструкцией идет #pragma once, которая AFAIK служит для того-же, что и эта конструкция- исключает повторный инклюд файла.

Drongo 05-06-2010 18:15 1427982

pva, Красиво объяснил. :up: Я так писал всегда, просто потому что в книге написано было именно так и без пояснений почему так. :)
Цитата:

Цитата pva
1.h:
#ifndef 1_H
#define 1_H
int a;
#endif »



Время: 16:45.

Время: 16:45.
© OSzone.net 2001-