Сообщение об ошибке: чистый абстрактный класс, заключенный в пространство имен в C ++ - PullRequest
1 голос
/ 05 февраля 2012

Нужна помощь в реализации чистого абстрактного класса через наследование , с использованием пространства имен , чтобы обернуть все мои классы, чтобы избежать конфликта с другими.

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

Кажется, что компилятор Visual Studio 2010 жалуется, что, несмотря на то, что все классы находятся в одном и том же пространстве имен, чистый абстрактный метод абстрактного класса не реализован.

Любая помощь будет высоко ценится.

//IBaseClass.h

//forward declaration
class ConcreteClass;

//namespace MyCustomNamespace
//{
    class IBaseClass
    {
    public:
        virtual ~IBaseClass() { /*virtual destructor*/ }
    //Behaviours...
        virtual bool Method001( const ConcreteClass &cc ) = 0;
        //virtual bool Method002(/*some input*/) = 0;
    };
//} /*NAMESPACE*/

//-----------------------------------------
//ParentClass.h

//namespace MyCustomNamespace
    //{
    class ParentClass : virtual public IBaseClass
    {
    private:
        int a;

    public:
        virtual ~ParentClass() { /*virtual destructor*/ }

        //getter-setter implemented in ParentClass.cpp file...
        void setA(const int aa); 
        const int getA() const; 
    };
//} /*NAMESPACE*/


//-----------------------------------------
//ConcreteClass.h

//namespace MyCustomNamespace
//{
    class ConcreteClass: public ParentClass 
    {
    private:
        int b;

    public:
        virtual ~ConcreteClass() { /*virtual destructor*/ }

        //getter-setter...
        void setB(const int bb);             
        const int getB() const;

        bool Method001( const ConcreteClass &cc ); //re-declaring IBase abstract method...
    };
//} /*NAMESPACE*/


//-----------------------------------------
//ConcreteClass.cpp


//namespace MyCustomNamespace
//{
    void ConcreteClass::setB(const int bb) { this->b = bb; } 
    const int ConcreteClass::getB() const { return this->b; }

    bool ConcreteClass::Method001( const ConcreteClass &cc )
    {
        //implementation code goes here...
        return false;
    }
//} /*NAMESPACE*/

1 Ответ

0 голосов
/ 06 февраля 2012

Проблема в том, что ваш прямой класс был объявлен в другом пространстве имен (в частности, в глобальном пространстве имен). Таким образом, виртуальный объект для переопределения - это другой символ с другим типом параметра.

Как написано, компилятор сопоставляет ConcreteClass с предварительным объявлением, которое он видит в глобальном пространстве имен при объявлении в базе:

virtual bool Method001( const ConcreteClass &cc ) = 0;

Когда вы объявляете Method001 в ConcreteClass:

virtual bool Method001( const ConcreteClass &cc );

компилятор сопоставляет cc с MyCustomNamespace::ConcreteClass, потому что это более точное соответствие.

Чтобы решить эту проблему, просто поместите вашу предварительную декларацию в правильное пространство имен:

namespace MyCustomNamespace {
  class ConcreteClass;
}
...