c++ - 函数重载类设计

标签 c++ overloading default-arguments

我的程序有一个 Car 和 CarManager 类,看起来类似于以下内容:

#include <list>

class Car
{
public:
    void Draw() { Draw(m_opacity); }
    void Draw(float opacity)
    {
    }

private:
    float m_opacity;
};

class CarManager
{
public:
    //Draw cars using their m_opacity member
    void DrawCars() 
    { 
        for(auto i = m_cars.begin(); i != m_cars.end(); i++)
            i->Draw();
    }

    //Draw cars using opacity argument
    void DrawCars(float opacity)
    {
        for(auto i = m_cars.begin(); i != m_cars.end(); i++)
            i->Draw(opacity);
    }

private:
    std::list<Car> m_cars;
}

MyApplication::OnRender()
{
    CarManager* pCarManager = GetCarManager();

    //If this condition is met, I want all cars to be drawn with 0.5 opacity.
    if(condition)
        pCarManager->DrawCars(0.5f);

    //Otherwise, draw cars using their m_opacity value.     
    else
        pCarManager->DrawCars();
}

C++ 不允许将非静态成员用作默认参数,因此我重载了绘图函数。如果未提供参数,则将使用类成员调用函数的重载版本。

每辆车都有一个用于渲染的 m_opacity 成员。但是,在某些情况下,我想为我希望所有汽车使用的不透明度指定一个值。在这些情况下,我希望忽略 m_opacity 以支持我提供的值。

在此示例中,CarManager::DrawCars() 中的渲染代码相当小,因此通过对 Car::Draw() 的不同调用重复相同的代码并不是什么大问题。但是在我的实际程序中,重复所有相同的代码是不切实际的。

这开始变得困惑了。有没有更好的方法来解决这个问题?

最佳答案

一种简单的方法是使用魔法值:

#include <list>

class Car
{
public:
    static float noOpacity() { return -1; }

    void Draw(float opacity)
    {
        if (opacity==noOpacity()) {
            opacity = m_opacity;
        }
        // etc.
    }

private:
    float m_opacity;
};

class CarManager
{
public:
    //Draw cars using optional opacity argument
    void DrawCars(float opacity = Car::noOpacity(); )
    {
        for(auto i = m_cars.begin(); i != m_cars.end(); i++)
            i->Draw(opacity);
    }

private:
    std::list<Car> m_cars;
}

关于c++ - 函数重载类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13337337/

相关文章:

c# - 通用接口(interface)重载。有效术语?

python - 指定默认参数的惯用方式,其存在/不存在很重要

python - pybind11 中的命名默认参数

c++ - 重载运算符参数

c++重载具有不同参数的3个函数(int,* int,& int)

javascript - ES6获取默认参数/参数

c++ - 如何在Vector类中使operator =?

c++ - 不带星号的函数指针参数

c++ - DirectShow 筛选器未显示为输入捕获设备

c++ - 如何将方法添加到类(Helper 函数)?