gpt4 book ai didi

C++ 使用一种共享方法推送到 3 个不同的 vector

转载 作者:太空狗 更新时间:2023-10-29 20:39:28 26 4
gpt4 key购买 nike

我是 C++ 的新手,我发现指针、双指针和引用的整个概念有些令人困惑。

我正在为一项任务编写一个对象加载器,现在我想优化/模块化我的解决方案。

现在我有 3 个 vector ,其中包含有关对象纹理坐标、面和法线的信息。我不想对每个 vector 都进行操作,而是希望通过引入一种方法来处理推送到以下 vector 来整理我的代码库。

std::vector<XMFLOAT3> vert_texture_coord;
std::vector<XMFLOAT3> vert_normals;
std::vector<XMFLOAT3> vert_position;

目前我是这样给他们写信的:

vert_text_coord.push_back(XMFLOAT3(vert_x, vert_y, vert_z));

但是为了模块化我写了一个方法:

push_to_vector(float x, float y, float z, *vector)
{
// push code here
}

这样调用

push_to_vector(vert_x, vert_y, vert_z, &vert_text_coord);

在我的 push_to_vector 方法中,我将 vert_text_coord 的引用传递给指针参数 *vector 是否正确,或者我是否正在这样做错误的?最后,将参数 vert_x, vert_y, vert_z 作为引用是否也有意义,还是我完全误解了 & 的概念?

提前致谢。

最佳答案

实际上,我认为您在这里问错了问题。是的,您可以完美地将指针/引用传递给将 XMFLOAT3 推送到 vector 末尾的函数,工作代码将是

//function signature:
push_to_vector(std::vector<XMFLOAT3>* v, float x, float y, float z);

//call:
push_to_vector(&ver_normals, x, y, z);

或使用引用

//function signature:
push_to_vector(std::vector<XMFLOAT3>& v, float x, float y, float z);

//call:
push_to_vector(ver_normals, x, y, z);

但是,正如我所说,这回答了错误的问题。正确的问题应该是:push_to_vector() 函数的想法好吗?我相信,事实并非如此。原因是,push_to_vector() 函数是错误的抽象。使用您的三个 vector 的代码永远不想从它使用的 vector 中抽象出来,它会想要从它使用一个 vector 的事实中抽象出来。

函数太长是不好的,但是像 push_to_vector() 函数这样的单行函数也很糟糕。每个功能都应努力在其使用的内容和提供的内容之间在抽象级别上具有足够大的差异。如果不是这种情况,您将迷失在您将创建的深层调用层次结构中。

(这绝非偶然,International Obfuscated C Code Contest 的获胜条目要么将所有内容融合到一个函数中,要么有大约 50 个函数,每个函数只有几个字符长。这两种方法在混淆方面同样有效代码。)


这是我对使用指针还是引用更好的问题的两分钱:

考虑以下五个函数:

void foo(int x);
void bar(int& x);
void baz(int* x);
void bim(const int& x);
void bam(const int* x);

及其对应的调用:

int var = 7;
foo(var); //may not change var
bar(var); //may change var
baz(&var); //may change var
bim(var); //may not change var
bam(&var); //may not change var

第一次调用是 C++ 中的正常情况,它不能更改其参数,因为它使用按值传递。我相信这是一个非常好的主意,如果你可以直接在调用中看到调用是否会改变它的参数。因此,我限制自己使用按值传递、按指针传递或按 const 引用传递,即。 e.这三种变体:

foo(var);    //may not change var
baz(&var); //may change var, visible by the take-address operator
bim(var); //may not change var, pass by value semantics optimized via a const reference

关于C++ 使用一种共享方法推送到 3 个不同的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27786147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com