C ++ «Импорт» класса enum из другого файла C ++ - PullRequest
1 голос
/ 22 июня 2019

Я пришла из Java, поэтому, пожалуйста, потерпите меня:)

Я пытаюсь «импортировать» (используя терминологию Java) enum class из другого файла C ++, чтобы иметь возможность использовать его напрямую, без префикса имени класса.

Так, например, допустим, у меня есть это в заголовочном файле:

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

Теперь, если я хочу использовать Bar из другого файла C ++, я делаю это:

#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 Ответ

2 голосов
/ 22 июня 2019

Используйте псевдоним типа через оператор 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);
}
...