从C ++中相同命名空间的类继承的问题

时间:2010-02-11 18:32:24

标签: c++ namespaces include compiler-errors

我很高兴使用C ++,直到编译时间到来。

我在一些命名空间里面有几个类(我们称之为N);这些类中的两个对应于一个基类,而另一个对应于它。每个类都有自己的.hpp和.cpp文件对;我认为它看起来像:

namespace N{

    class Base{
    };

    class Derived: public Base{
    };

}

然而,g ++(也许是链接器)一直告诉我:

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

它不能将Base识别为一个类,即使我正确地#include了与其定义相对应的hpp文件到Derived的.hpp!

“这是#includes的东西”,我想,因为这些类的.hpps在其他文件中是#included,所以我将它添加到Derived.hpp中的Derived声明中:

#include "Base.hpp"
namespace N{

    class Base;

    class Derived: public Base{
    };
}

现在g ++抱怨:

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 个答案:

答案 0 :(得分:3)

您的文件应如下所示:

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() {}
    };
}

答案 1 :(得分:3)

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

这让我觉得您在#include "Base.hpp源文件中没有Derived.cpp

编辑:在Derived.cpp中,尝试将#include的顺序更改为:

#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() {}
    };
}