1

.hファイルを関数プロトタイプに書き、実装で署名を変更する方法があるかどうか疑問に思っていたので、プロトタイプとは少し異なります。

私がそれをやりたい理由は、.hファイルにはしたくない列挙型の#includeがいくつかありますが、.cファイルにのみあり、列挙型は関数の署名の一部であるためです。列挙型をINT(enumとintは基本的に同じです..)またはプロトタイプで何かとして書くことができるかどうか疑問に思っていましたが、コンパイルエラーが発生します..それを行うための良い方法はありますか?

前もって感謝します..

4

4 に答える 4

6

私が正しく理解していれば、いつでもラッパー関数を作成できます。

file.h

void DoSomething(int i);

ファイル.cpp

void DoSomething(int i)
{
    ActuallyDoSomething((MyEnum)i);
}

static void ActuallyDoSomething(MyEnum myEnum)
{
    // Do something
}

OOP プログラムの場合、次のようになります。

file.h

class ISomething
{
    virtual void DoSomething(int i) = 0;
};

ファイル.cpp

class Something : ISomething
{
private:
    void ActuallyDoSomething(MyEnum myEnum)
    {
        // ...
    }

public:
    void DoSomething(int i)
    {
        ActuallyDoSomething((MyEnum)i);
    }
}

編集:コメントへの応答: 関数のオーバーロードを提供することをお勧めします。

file.h

void DoSomething(int i);
void DoSomething(MyEnum myEnum);

ファイル.cpp

void DoSomething(int i)
{
    DoSomething((MyEnum)i);
}

void DoSomething(MyEnum myEnum)
{
    // Do something
}

最終編集:このソリューションは、C++11 を使用しなくても機能するはずです。

file.h

#pragma once

enum MyEnum;

void DoSomething(int i);
void DoSomething(MyEnum enum);

FileWithMyEnum.h

#pragma once

enum MyEnum
{
    One,
    Two,
    Three
};

ファイル.cpp

#include <file.h>
#include "FileWithMyEnum.h"

// Implementations
于 2012-12-18T09:04:02.553 に答える
1

前方宣言ヘッダーの作成方法の概要を説明します。このテクニックは からおなじみかもしれませ<iosfwd><iostreams>。列挙型を前方宣言できるのは C++11 のみであることに注意してください。

huge_header_with_e.h
enum E { Zero, One, Two };

great_lib_fwd.h
enum E;
void f(E);

great_lib.h
#include "great_lib_fwd.h"
#include <huge_header_with_e.h>
void f(E e);

great_lib.c++
#include "great_lib.h"
void f(E e) { /* do something with e */ }

other_client.h
#include "great_lib_fwd.h"
void other_client(E);

other_client.c++
#include "other_client.h"
#include "great_lib.h"
void other_client(E e) { /* use e */ }

のような非常に限られたコンテキストではother_client.h、 を含めることhuge_header_with_e.hは引き続き回避されることに注意してください。

実際には、クライアント コードで特定の列挙型定数を指定する必要があることが多く、huge_header_with_e.hとにかくインクルードする必要があることがわかると思います。そのため、依存関係を回避する翻訳単位は比較的少数です。

于 2012-12-18T10:36:07.653 に答える
1

C++ であれば、関数のオーバーロードを使用できると思います。

file.h

void DoSomething(int i);

ファイル.cpp

void DoSomething(MyEnum myEnum)
{
    // Do something
}

void DoSomething(int i)
{
    DoSomething((MyEnum)i);
}

私はしばらく C++ を使用していません。したがって、これが期待どおりに機能するかどうかは 100% わかりません。

于 2012-12-18T09:13:23.717 に答える
0

あまり。C++11 では、ヘッダーで不透明な enum 宣言を使用できるため、enum 定数を指定する必要はありませんが、一般的に、anenumは十分に軽量であり、通常は追加の依存関係を導入しないため、必要に応じてそれを含めることに対する本当の議論ではありません。

于 2012-12-18T09:13:28.210 に答える