C ++原型不同然后实现

时间:2012-12-18 09:01:15

标签: c++ c

我想知道是否有办法可以将.h文件编写为函数原型,并且在实现中更改签名,因此它与原型略有不同。

我想要这样做的原因是因为有一些枚举类型的#include我不想在.h文件中做,但只在.c文件中,并且枚举是函数的一部分签名,所以我想知道我是否可以将枚举编写为INT(枚举和int基本相同..)或原型中的某些东西,但后来我得到了编译错误.. 我能做到这么好吗?

提前致谢..

4 个答案:

答案 0 :(得分:6)

如果我理解正确,你总是可以创建一个包装函数,例如

file.h

void DoSomething(int i);

file.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;
};

file.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);

file.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
};

file.cpp

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

// Implementations

答案 1 :(得分:1)

如果它是C ++,我猜你可以使用函数重载。

file.h

void DoSomething(int i);

file.cpp

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

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

我暂时没有使用过C ++。因此,不是100%确定这是否会按预期工作。

答案 2 :(得分: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,因此相对较少的翻译单元将避免依赖。

答案 3 :(得分:0)

不是真的。在C ++ 11中,您可以在标头中使用不透明的枚举声明,这样您就不必指定枚举常量,但通常enum足够轻,并且通常不会引入任何额外的依赖关系,因此没有真正的论据反对在任何需要的地方包含它。