它的前向声明是c++程序中唯一的选项

Is forward declaration is the only option in the C++ program?

本文关键字:程序 选项 c++ 唯一 声明      更新时间:2023-10-16

c++是否有其他替代的前向声明?例如,我有一个类B,它使用类a。

class B
{
    public:
    void set_classA_val( A &b);
};
class A
{
    private:
    int example;
};

除了将类A置于类B之上之外,是否有其他方法可以解决此编译问题?我们还有别的选择吗?向前申报是唯一的解决方案吗?

是,

如果你不想把A放在B之前,那么在这种情况下,前向声明是唯一的解决方案(如果你不想改变B的定义-参见Zac Howland回答其他改变B的想法)。这没有什么错。不知何故,来自B的方法需要知道A是什么(在这种情况下,它是一个类)。要么,编译器会找到一个定义,要么你会帮助编译器向前声明。

任何名称在使用前都必须声明。如果您不喜欢下面的代码

class A;
class B
{
    public:
    void set_classA_val( A &b);
};

则可以在成员函数set_classA_val

的参数声明中使用详细的类型名称
class B
{
    public:
    void set_classA_val( class A &b);
};

有一些选择,但是如果没有更多关于你的目标的信息,很难告诉你哪个是最好的。前向声明、移动A的定义以及使B成为模板类是一些选项。假设您熟悉前者,后者看起来像:

template<typename T>
class B
{
public:
    set_value(T& t);
};

你可以使用:

B<A> ba;

正如jrok所提到的,你也可以使函数本身成为一个模板——但使用将取决于B如何使用该参数(例如,如果其他函数也需要该类型,则可能最好让整个类都使用它)。