0

语言:CPP (C++)

我不确定是否梦到了这一点,但是是否可以将类对象作为参数传递给期望不是类类型而是类中的类型的函数。

真的很好,而不是做我可以有一些规则的函数(对象->目标变量),所以我可以做

function(object)

这将等于:

function(object->target_variable)

有没有办法指定这种期望的行为?

4

3 回答 3

1

您可以在类中创建一个强制转换运算符,然后每次某个函数需要某种类型并且您提供该类的一个实例时,它将提供其成员。如果您有多个成员可能希望像这样处理(具有相同类型),则不起作用。

或者您可以重载该函数,接受对类实例的引用并使用实例成员调用原始函数。这里的缺点是您需要为每个类重载函数,或者为所有这些类创建一个共同的祖先(接口或“合同”)。

于 2013-01-16T13:12:43.163 回答
1

好的,这不再适合评论。如果它“基本上是一份合同”,那么就创建一个!例如:

struct IDeliverSDLSurface {
    virtual SDL_Surface* GetSurface() const = 0;
    virtual ~IDeliverSDLSurface() = default;
};

class A : public IDeliverSDLSurface {
    SDL_Surface* m_Surface;

    // implements IDeliverSDLSurface
    virtual SDL_Surface* GetSurface() const
    {
        return m_Surface;
    }

    // other stuff    
};

class B : public IDeliverSDLSurface { /* etc */ };

// etc.

然后编写一个中间层,服务IDeliverSDLSurface*将表面传递给适当的“引擎”服务,例如:

namespace Intermediate {
    void Foo(IDeliverSDLSurface* p_Object)
    {
        // call engine's Foo
        Engine::Foo(p_Object->GetSurface());
    }

    void Bar(IDeliverSDLSurface* p_Object)
    {
        // call engine's Bar
        Engine::Bar(p_Object->GetSurface());
    }

    // etc
}

可以编写一种更复杂的(半自动)调度程序,但是您明白了……在客户端,您可以调用Intermediate具有实现的所有类型的所有实例的函数IDeliverSDLSurface

A tA;
Intermediate::Foo(&tA);

B tB;
Intermediate::Bar(&tB);

// etc...
于 2013-01-16T11:17:34.337 回答
1

正如 SvenS 指出的那样,您可以在类中创建一个强制转换运算符。这是一个转换为 const char* 的示例。这段代码在你的课上:

// operator to cast to a const char *
// 
operator const char *()
{
    m_pStr[m_nSize] = '\0';
    return(m_pStr);
}

有关完整示例,请参见:http: //msdn.microsoft.com/en-us/library/ts48df3y.aspx

于 2013-01-17T13:38:24.693 回答