处理这种情况的最佳做法是什么?
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;
}
答案 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)声明它。