【问题标题】:Using multiple structs through header files C++通过头文件C++使用多个结构
【发布时间】:2015-03-22 19:25:21
【问题描述】:

抱歉,如果您之前看到过这个问题,但它尚未得到回答,基本上在我的代码中,我有两个结构,在单独的标题中定义并在整个项目中全局使用。我只是希望在其他 cpp 文件中使用这两个结构(同样,在两个单独的头文件中定义),而不仅仅是头文件所属的那些。 这是我测试过的一些示例代码:

class1.h

    #include "class2.h"
    #include <vector>
    #include <string>

    struct trans1{
        string name;
    };
    class class1 {

    private:
        vector <trans2> t2;

    public:
        class1();
    };

class2.h

    #include "class1.h"
    #include <vector>
    #include <string>        

    struct trans2{
        string type;
    };

    class class2{

    private:
        vector <trans1> t1;

    public:
        class2();
    };

错误日志:

    In file included from class1.h:3:0,
                     from class1.cpp:1:
    class2.h:21:13: error: 'trans1' was not declared in this scope
         vector <trans1> t1;
                 ^
    class2.h:21:19: error: template argument 1 is invalid
         vector <trans1> t1;
                       ^
    class2.h:21:19: error: template argument 2 is invalid

我知道这在现实世界的应用程序中是荒谬的代码,但这是我可以演示的最简单的方法。

值得注意的是,如果我只是在“private:”下注释掉向量 t1 或 t2 的声明,则代码编译不会失败。这只是我使用第二个结构的事实。

对任何人有帮助吗?谢谢。

【问题讨论】:

标签: c++ vector struct


【解决方案1】:

只需向前声明将要使用的类。将所有实现代码放到一个cpp文件中,而不是内联在header中。

将向量设为私有。这样,任何包含标头的文件都不能针对不完整的类强制生成代码。

【讨论】:

  • 向量需要结构的完整声明。除非将向量更改为存储指针,否则这将不起作用。
  • 我可以确认这种技术确实有效,即使在声明向量时类没有完全定义。 goo.gl/tfpe90
  • 据我了解,标准委员会对是否应该允许存在(或曾经)一些分歧。令人惊讶的是,允许它的争论使得向量更容易有效地实现。我认为就目前的情况而言,我所做的事情不应该按照严格的标准解释来工作,但实际上总是如此。你学到的东西是吗? :)
【解决方案2】:

您可以尝试在 class2.h 中转发声明 trans1,在 class1.h 中声明 trans2,如下所示:

class2.h:

// includes
struct trans1;
// rest of your code

class1.h 中的相同内容(但使用 trans2)

不要忘记在你的代码中添加 Include 守卫!

  • 编辑:是的,你需要改变你的向量来存储指针,否则它不会链接

【讨论】:

  • 我认为这更糟,因为现在您必须担心如何分配和删除向量对象。
【解决方案3】:

您需要将“trans”结构放入它们自己的头文件中,并将它们包含在您的类头文件中。

您可以转发声明它们,但这需要更改您的向量以使用指针。 (在这种情况下,我会推荐std::vector&lt;std::unique_ptr&lt;trans&gt;&gt;)。如果您的结构又大又复杂,这可能是合适的。

前向声明方法的主要优点是减少编译时间。但是,如果结构真的像您的示例中那样简单,我不会为在此处使用指针的额外开销而烦恼。

【讨论】:

    【解决方案4】:

    如果您要在单个 .cpp 文件中执行此操作,则解决方案将很简单:

       struct trans1 { ... };
       struct trans2 { ... };
       class class1 { ... };
       class class2 { .... };
    

    现在您只需重新排列代码即可在每个翻译单元中获得此结果。 (文件中类/结构的顺序很重要)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      相关资源
      最近更新 更多