将对象作为参数传递,以传递对象的变量

时间:2013-01-16 10:28:32

标签: c++ oop class

语言:CPP(C ++)

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

非常好,而不是做功能(object-> target_variable) 我可以有一些规则,所以我可以做到

function(object)

等于:

function(object->target_variable)

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

3 个答案:

答案 0 :(得分: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中的函数,其中所有类型的所有实例都实现{ {1}}:

IDeliverSDLSurface

答案 1 :(得分:1)

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

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

答案 2 :(得分: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