Проблемы наследования от класса в том же пространстве имен в C ++ - PullRequest
2 голосов
/ 11 февраля 2010

Я счастливо работал в C ++, пока не наступило время компиляции.

У меня есть несколько классов внутри некоторого пространства имен (назовем это N); два из этих классов соответствуют одному базовому классу, а другие являются его производными. Каждый класс имеет свою собственную пару файлов .hpp и .cpp; Я думаю, что это будет выглядеть так:

namespace N{

    class Base{
    };

    class Derived: public Base{
    };

}

Однако g ++ (возможно, компоновщик) постоянно говорит мне:

Derived.hpp:n: error: expected class-name before ‘{’ token

Он не распознает Base как класс, даже если я правильно # включил hpp-файл, соответствующий его определению, в .hpp!

Derived.

«Это что-то с #include», подумал я, поскольку .hpps этих классов #include в других файлах, поэтому я добавил это в объявление Derived в Derived.hpp:

#include "Base.hpp"
namespace N{

    class Base;

    class Derived: public Base{
    };
}

А теперь г ++ жалуется:

Derived.hpp:n: error: invalid use of incomplete type ‘struct N::Base’

Итак, я заблудился здесь. Пожалуйста, помогите мне, я буду высоко ценить это. :)

(Кстати, я довольно опытный в Python, а не в C ++, так что эти вопросы мне действительно странны. Кроме того, я изменил имена классов и прочее:).

Редактировать: Более точное представление моих файлов:

File Pieza.hpp
-----------------------
#include "Celda.hpp"

namespace Reglas
{
    class Pieza
    {    
        public:
        Pieza() {}
        virtual ~Pieza() {}

        private: 
        Celda *c; 
    };
}


File Jugador.hpp
-----------------------
#include "Jugada.hpp" 
#include "Excepciones.hpp"
#include "Pieza.hpp"
namespace Reglas
{  
//compiler asked for these :S
class Celda;
class Tablero;
    class Jugador : public Pieza
    {
        public:
        Jugador() {}
        virtual ~Jugador() {}
    };
}

Ответы [ 2 ]

3 голосов
/ 11 февраля 2010
Derived.hpp:n: error: invalid use of incomplete type ‘struct N::Base’

Это заставляет меня думать, что вы не #include "Base.hpp в Derived.cpp исходном файле.

РЕДАКТИРОВАТЬ: В вашем Derived.cpp, попробуйте изменить порядок #include s на:

#include "base.hpp"
#include "derived.hpp"

// .. rest of your code ..

Как это:

// Derived.hpp
#pragma once

namespace foo
{
    class Base;

    class Derived : public Base
    {
    public:
        Derived();

        ~Derived();
    };
}

// Derived.cpp
#include "base.hpp"
#include "derived.hpp"

namespace foo
{
    Derived::Derived()
    {
    }

    Derived::~Derived()
    {
    }
}

Итак, вам нужно отредактировать Jugador.hpp, чтобы он выглядел так:

// Jugador.hpp
#include "Pieza.hpp" // move this above Jugada.hpp
#include "Jugada.hpp" 
#include "Excepciones.hpp"
namespace Reglas
{  
//compiler asked for these :S
class Celda;
class Tablero;
    class Jugador : public Pieza
    {
        public:
        Jugador() {}
        virtual ~Jugador() {}
    };
}
3 голосов
/ 11 февраля 2010

Ваши файлы должны выглядеть так:

File Base.hpp
-----------------------
namespace N
{
    class Base
    {    
        public:
        Base() {}
        virtual ~Base() {}   // Make sure you have a virtual destructor
    };
}


File Derived.hpp
-----------------------
#include "Base.hpp"
namespace N
{  
    class Derived : public Base
    {
        public:
        Derived() {}
        ~Derived() {}
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...