Доступ к Static Method и Static bool в другом классе - PullRequest
0 голосов
/ 30 декабря 2011

У меня есть базовый интерфейсный класс:

class A
{
public:
    ITask(){}
    virtual bool Start()=0;
    virtual void Update()=0;
    virtual void Stop()=0;
};

Теперь у меня есть 2 других класса, которые наследуются от этого

#include "A.h"
#include "C.h"
class B: public A
{
public:
    bool Start(){} 
    void Update()
    {
        c.Start();
    } 
    void Stop(){}

    static bool m_run;

    static void SetRun(bool run)
    {
        m_run = run;
    }
private:
    C c;
};

наконец, у меня третий класс:

#include "A.h"
#include "B.h"
class C : public A
{
public:
    bool Start()
    {
        B::SetRun(false); // cant do this
        B::m_run = false; // or this
    }
    void Update()
    {

    }
    void Stop()
    {

    }
}

Для простоты я сбрил часть кода.

Я не понимаю, почему я не могу получить доступ к статической переменной в B. Нужно ли указывать ее в качестве указателя или ссылки?

Я получаю 2 ошибки:

error C2653: 'B' : is not a class or namespace name
error C3861: 'm_run': identifier not found

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Хотя вы не показываете это, я предполагаю, что B.h включает C.h;в противном случае строка C c; не будет компилироваться.Это вызывает циклическую зависимость в заголовочных файлах: B.h должно быть включено до C.h, что должно быть включено до B.h, что невозможно.

Самое простое решение - переместить тело C::Start из определения C, так что C.h не нужно включать B.h.Определение функции может идти в исходный файл или в отдельный заголовок, если вы хотите сохранить его встроенным.

В качестве альтернативы, вы можете изменить B, чтобы он содержал std::unique_ptr<C> вместо экземпляра Cи реализовать конструктор (в исходном файле или в отдельном заголовке), который инициализирует его с new C.Тогда B.h нужно только направить объявление class C; вместо включения C.h.

Лучшим решением, если это возможно, было бы переосмысление отношений между классами, чтобы не было круговой зависимости.

(ОБНОВЛЕНИЕ: когда я писал этот ответ, вопрос изменился, чтобы показать, что B.h действительно включает C.h, как я и догадывался.)

0 голосов
/ 30 декабря 2011

Нет ничего плохого в вашем примере кода (после правок), проблема должна быть где-то еще, например, не удалось включить.

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