Доступ к другим абстрактным классам без ссылки на c ++ - PullRequest
0 голосов
/ 16 мая 2019

Я наткнулся на старый код, в котором мало проектов, и в каждом из них есть несколько абстрактных классов, заголовков и файлов cpp. Странно то, что в одном из проектов абстрактный класс использует функцию, объявленную в другом абстрактном классе в том же проекте. Что меня удивило, так это отсутствие ссылки на другой абстрактный класс из текущего абстрактного класса, и компилятор не выдавал никаких ошибок. Единственное, что я заметил, это то, что оба файла находятся в пространстве имен.

Может кто-нибудь объяснить, как это возможно?

Вот пример кода класса, на который ссылается

#ifndef ClassADef
#define ClassADef

#include <string>

namespace globalNameSpace {
class ClassA {
public:

    virtual ~ClassA() = default;
    virtual std::string method1() const = 0;
};
}
#endif

Вот пример кода для класса, который ссылается на вышеуказанный класс.

#ifndef ClassBDef
#define ClassBDef

#include <string>

//I was expecting an include statement which references the above class

namespace globalNameSpace {
class ClassB {
public:
    virtual std::string method2(const ClassA& method1, const bool variable) = 0; 
//I was expecting the compiler to throw an error.
};

}

#endif

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Помимо предварительного объявления или явного включения, может быть другой файл CPP, который включает оба заголовка в правильном порядке:

#include <ClassADef>
#include <ClassBDef>

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

0 голосов
/ 16 мая 2019

Использование ссылки на ClassA представляется действительным, если только ClassA объявлен заранее до определения ClassB.

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