首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在一个函数中避免过多的参数。C++

如何在一个函数中避免过多的参数。C++
EN

Stack Overflow用户
提问于 2020-04-24 13:13:46
回答 4查看 1.3K关注 0票数 0

我正在用我的OpenGL c++做的小游戏引擎做一个小游戏。我必须使许多类,如相机,BatchRenderer,AudioEngine,ParticleEngine,水平,玩家,僵尸,人类等现在玩家必须与类互动,如相机,BatchRenderer,AudioEngine,ParticleEngine,关卡数据从水平类,僵尸,人类等,我通过引用他们中的大多数被初始化在我的主游戏类。

//在游戏主类和播放器中创建的AudioEngine和ParticleEngine需要播放声音和模拟粒子渲染播放器需要TextureID、位置、半径(大小)、旋转、深度和颜色。

代码语言:javascript
复制
Player::Player(AudioEngine& a_audioEngine, ParticleEngine& a_particleEngine
               GLuint a_textureID, glm::vec2 a_position, float a_radius,
               float a_rotation, float a_depth, Color a_color)
{...}

//用于检查播放器是否在视线内的摄像头levelData,僵尸,人类来检查玩家的碰撞检测。

代码语言:javascript
复制
void Player::update(Camera& camera, std::vector<std::string>& levelData,
                    std::vector<Zombie>& zombies, std::vector<Human>& humans,
                    float deltaTime)

在这里你可以看到传递给player类的参数太多了,将来还需要更多。但是我听到很多人说,在一个函数中有两个或三个以上的参数是不好的。在我的游戏中,有很多类需要5到6个以上的参数。

这对于游戏来说是正确的呢,还是这是一个糟糕的做法?请告诉我如何解决这个问题。

对不起,我的英语不好。非常感谢您的阅读。

EN

回答 4

Stack Overflow用户

发布于 2020-04-24 13:21:36

只有当你在程序中大量调用你的函数时,有太多的参数才是不好的,因为你要支付将函数的参数放到堆栈上的成本,以及函数调用的间接性。

如果你不经常调用这些函数,那么就别费心打包这些变量了。

如果您需要打包变量,只需将它们放入struct中并将单个参数传递给函数(通常是避免复制的引用)!

票数 0
EN

Stack Overflow用户

发布于 2020-04-24 14:15:51

在函数中有太多的参数是不好的,但它不是可伸缩的和整洁的。它给用户带来了功能上的不便,对你来说也很难维护。你不能在函数中添加或删除参数,这样做会花费很多时间。还有一件事,你也不需要做太长的struct。如果结构变得太长,拆分成有意义的结构。

票数 0
EN

Stack Overflow用户

发布于 2020-04-24 15:19:33

如果你真的很关心它,你可以在一个结构中传递参数。就编译器而言,它的效率丝毫不会降低。

如果您有c++17,您可以使用结构化绑定来解包结构,以提高可读性。

如果你有c++20,你可以用命名初始化来创建结构。

例如:

代码语言:javascript
复制
#include <string>

struct vec {
    double x, y, z;
};

struct func_args {
    int a;
    std::string b;
    double c;
    vec x , y , z;
};

void foo(std::string const&, vec const&);

void func(func_args const& args) {
    // c++17 feature - structured binding (in this case by reference)
    auto& [a, b, c, x, y, z] = args;
    foo(b, x);
}

// or by value...
void func(func_args&& args) {
    auto [a, b, c, x, y, z] = std::move(args);
    foo(b, x);
}

void test()
{
    // c++20 feature (and gcc extension prior). Named initialisation.
    func({ .a = 0, .b = "alien", .c = 0.0, 
        .x = { -1, 1, 0}, 
        .y = { -1, 1, 0}, 
        .z = { -1, 1, 0}});

    auto const args2 = func_args { 
        .a = 0, .b = "alien", .c = 0.0, 
        .x = { -1, 1, 0}, 
        .y = { -1, 1, 0}, 
        .z = { -1, 1, 0}};
    func(args2);
}

C++每年看起来都更像javascript :)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61401594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档