C ++头文件引用下面定义的结构

时间:2015-05-20 18:36:06

标签: c++ struct header-files declaration

处理这种情况的最佳做法是什么?

class A {
    private:
        std::vector<B> derp;
    public:
        struct B { ... };
        void foo(B b);
}

(问题是这段代码会说“错误:使用未声明的标识符'B'” 我想我可以通过做像

这样的事情来解决问题
class A {
    public:
        struct B { ... };
        void foo(B b);
    private:
        std::vector<B> derp;
}

但这似乎很奇怪,而不是正确的解决方案。另外作为旁注,如果我要写,我应该这样写吗?

struct A {
    struct B { ... };
    void foo(B b);

    private:
        std::vector<B> derp;
}

2 个答案:

答案 0 :(得分:1)

如果您在宣布B之前不想移动derp的定义,则可以在声明B之前使用derp的前瞻声明。

class A {
   public:
      struct B;
   private:
      std::vector<B> derp;
   public:
      struct B { ... };
      void foo(B b);
};

但是,从物理布局的角度来看,类的public部分应位于其private部分之前。您希望用户首先看到public部分。

鉴于此,我认为最好使用它:

class A {
    public:
        struct B { ... };
        void foo(B b);
    private:
        std::vector<B> derp;
};

这解决了在声明成员变量B之前未声明/定义derp的问题。它还会将public部分放在private部分之前。

答案 1 :(得分:0)

就像变量一样,您可以转发声明类和结构。例如,在您的情况下,您可以执行以下操作:

class A {
public:
    struct B;
private:
    std::vector<B> derp;
public:
    struct B { ... };
    void foo( B b );
};

请记住,如果您在类中转发声明类或结构,则需要使用与稍后定义的相同的访问级别(private / protected / public)声明它。