C++ "Importing"来自另一个 C++ 文件的枚举类

标签 c++ namespaces using

我有 Java 背景,所以请耐心听我说:)

我正在尝试从另一个 C++ 文件“导入”(使用 Java 术语)枚举类,以便能够直接使用它,而无需在其前面添加类名前缀。

例如,假设我在头文件中有这个:

class Foo
{
    public:
        enum class Bar {ITEM_1, ITEM_2};
        void doThings(Bar bar);
};

现在,如果我想使用另一个 C++ 文件中的 Bar,我会这样做:

#include "Foo.h"

void Foo2::methodInAnotherFile()
{
    Foo foo();
    Foo::Bar bar = Foo::Bar::ITEM_2;
    foo.doThings(bar);
}

现在我想做的是能够执行“导入”(使用 Java 术语)Bar 之类的操作,以便能够消除前缀 的需要BarFoo::,即 Bar bar = Bar::ITEM_2;

现在,由于我对 C++ 的了解有限,我能想到的一种方法是用 namespace FooNamespace{} 包围 Foo.h 中的所有代码,将 Bar 枚举从类中取出(但仍在命名空间中),然后将 using namespace FooNamespace 添加到 Foo2 的顶部类(class)。但是,对于我的应用程序来说,这确实没有多大逻辑意义,因为 Bar 枚举在逻辑上确实属于该 Foo 类。

由于我精通 Java,因此这里有一个我想做的 Java 示例:

文件1:

package org.fooclass;

public class Foo
{
    public static enum Bar
    {
        ITEM_1,
        ITEM_2;
    }

    public void doThings(Bar bar)
    {
        System.out.println("Item: " + bar.toString());
    }
}

文件2:

package org.foo2class;

import org.fooclass.Foo;
import org.fooclass.Foo.Bar; //I want to do THIS in C++

public class Foo2
{
    public void methodInAnotherFile()
    {
        Foo foo = new Foo();

        /*
         * Since I've 'imported' Foo.Bar, I can now
         * use Bar directly instead of having to do this:
         * Foo.Bar bar = Foo.Bar.ITEM2;
         */
        Bar bar = Bar.ITEM_2;

        foo.doThings(bar);
    }
}

最佳答案

使用 type alias通过 using 语句,例如:

#include "Foo.h"

using Bar = Foo::Bar; // <-- here

void Foo2::methodInAnotherFile()
{
    Foo foo;
    Bar bar = Bar::ITEM_2;
    foo.doThings(bar);
}

或者,限制其范围:

#include "Foo.h"

void Foo2::methodInAnotherFile()
{
    using Bar = Foo::Bar; // <-- here
    Foo foo;
    Bar bar = Bar::ITEM_2;
    foo.doThings(bar);
}

关于C++ "Importing"来自另一个 C++ 文件的枚举类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56712143/

相关文章:

c++ - alignof(T*) 对于所有可能的类型都相同吗? sizeof(T*) 呢?

c++ - 如何在 bash 文件异常退出时捕获异常?

c++ std::string.find 在 boolean 表达式中返回意外结果

c++ - "using namespace"究竟做了什么?

c++ - 给模板参数包起别名

c++ - 理解 C++ 中 argv 的转换

c# - 在 c# 中,如何选择命名空间和类使用的命名约定?

r - 当我在导入 ggplot2 的包中使用 ggplotGrob 函数时,找不到它

visual-studio-2012 - 有没有办法在 Visual Studio 2012 中批量组织使用?

c# - 在以不同方法创建的对象上使用