C++程序中是否只有前置声明是唯一的选项?

3

C++有没有其他替代前向声明的方法?例如,我有一个使用类A的类B。

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

class A
{
    private:
    int example;

};

除了将类A放在类B之前,还有其他解决此编译问题的替代方案吗?我们还有其他选择吗?前向声明是唯一的解决方案吗?


1
前置声明有什么问题吗?这就是它们存在的原因… - Ed S.
在那个时候,你不需要完整定义 A。你只需要在上面放置 class A; 就可以编译通过了。 - Cory Nelson
3个回答

4

是的,如果您不想在B之前放置A,则在这种情况下,前向声明是唯一的解决方案(如果您不想更改B的定义-请参见Zac Howland的答案以获取更改B的其他想法)。这没有任何问题。某种程度上,来自B的方法需要知道A是什么(在这种情况下,它是一个类)。要么编译器通过找到A的定义来弄清楚,要么您可以通过前向声明帮助编译器。


2
任何名称在使用前都必须声明。如果您不喜欢以下代码。请注意,HTML标签将被保留。
class A;

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

然后您可以在成员函数set_classA_val的参数声明中使用详细的类型名称。
class B
{
    public:
    void set_classA_val( class A &b);
};

1

有几个选项,但是如果没有更多关于你的目标的信息,很难告诉你哪个是最好的。前向声明、移动A的定义以及将B变为模板类都是一些选项。假设你对前两者已经熟悉了,那么后者看起来应该像这样:

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

你可以使用以下代码声明它:

B<A> ba;

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

1
@jrok 很好,这也可以(取决于B如何使用其模板参数)。 - Zac Howland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接