C ++从另一个C ++文件“导入”枚举类

时间:2019-06-22 02:27:20

标签: c++ namespaces using

我来自Java背景,请耐心等待:)

我正试图从另一个C ++文件中“导入”(使用Java术语)enum class,以便能够直接使用它而不必在类名前添加前缀。

例如,假设我在头文件中拥有此文件:

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之类的操作,从而无需在前缀Bar上加上Foo::,即Bar bar = Bar::ITEM_2;

现在,由于我对C ++的了解有限,因此可以想到的一种方法是将Foo.h中的所有代码都用namespace FooNamespace{}包围,将Bar枚举从类(但仍在名称空间中),然后将using namespace FooNamespace添加到Foo2类的顶部。但是,对于我的应用程序,实际上并没有多大的逻辑意义,因为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);
    }
}

1 个答案:

答案 0 :(得分:2)

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

#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);
}