Расширение класса в C ++ с использованием заголовочных файлов - PullRequest
2 голосов
/ 24 мая 2011

Я обнаружил, что для расширения класса мне нужно сделать следующее:

class x : public extendsThis { // rest here
};

Итак, я создаю 2 класса в двух отдельных файлах:

- particle.h -
class particle : public program {
};

 - program.h -

 class program {
    particle* myParticle;
 };

Однаков классе программы я хотел иметь объекты частиц, которые затем снова расширяют класс программы.

Это, однако, потребовало бы, чтобы у меня был файл include program.h в классе частиц, а файл частиц.h включался вкласс программы, чтобы дать им знать друг о друге.Это, однако, создало некоторый бесконечный цикл, который не позволил мне скомпилировать.

Есть ли способ обойти это, или я делаю что-то не так?

Ответы [ 5 ]

3 голосов
/ 24 мая 2011

Да, вы можете обойти это. Вы можете сделать очень простое объявление класса.

В программе. Ч .:

class particle;

class program
{
  particle *myParticle;
};

Имейте в виду, что вам нужно использовать указатель на частицу.

1 голос
/ 24 мая 2011

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

class a;

class b { a* ptr; };

Это также может указывать на необходимость переосмысления вашего дизайна.Обычно ваша программа должна «знать» о ее компонентах, но не об обратном.Компоненты программы должны быть небольшими автономными классами с простой четко определенной функцией.Если вы запутываете все классы, вы получаете «жуткое действие на расстоянии» (ошибки).;)

0 голосов
/ 24 мая 2011

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

#include <iostream>

class particle;

class program {
    particle* myParticle;

public:
    program();
};

class particle : public program {
public:
    particle()
    {
        std::cout << "Particle constructor\n" << std::flush;
    }
};

program::program()
{
    std::cout << "Program constructor\n" << std::flush;
    myParticle = new particle();
}

int main()
{
    program *myProgram = new program();
    delete myProgram;
    return 0;
}

Когда я компилирую и запускаю эту программу, она продолжает печатать «Конструктор программы», потому что particle::particle() всегда сначала вызывает program::program(), что приводит к бесконечному циклу. Закомментирование строки myParticle = new particle(); решает эту проблему.

0 голосов
/ 24 мая 2011

Это может быть только я, но кажется, что вы делаете это неправильно.Почему вы хотите расширить класс частиц с помощью программного класса?Теоретически, вы получите что-то вроде этого:

class particle {
    particle *myParticle;
};

Обратите внимание, как расширение класса может потенциально создать бесконечный цикл?Я имею в виду, что это только мое понимание, и я могу быть ужасно неправ, но это то, что нужно учитывать.Кто-то, дайте мне знать, если я уйду отсюда.

0 голосов
/ 24 мая 2011

Используйте включенные охранники в заголовочных файлах: http://en.wikipedia.org/wiki/Include_guard

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...