我有Material结构,它存储三个数组:ambient,diffuse和specular。 我用它来存储有关单个对象材料的信息。 头文件:
ExecStart=/bin/sh -c '/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server 2>&1 > /var/log.log'
源文件:
struct Material
{
float (&ambient)[4], (&diffuse)[4], (&specular)[4];
Material(float (&ambient)[4], float (&diffuse)[4], float (&specular)[4]);
float* Ambient();
float* Diffuse();
float* Specular();
}
我有这个函数来初始化对象:
Material::Material(float (&_ambient)[4], float (&_diffuse)[4], float (&_specular)[4]): ambient{_ambient}, diffuse{_diffuse}, specular{_specular}{}
float* Material::Ambient()
{
return ambient;
}
float* Material::Diffuse()
{
return diffuse;
}
float* Material::Specular()
{
return specular;
}
绘图功能:
float random(float min, float max)
{
return min + static_cast<float> (rand()) / static_cast<float> (RAND_MAX / (max - min));
}
void createBall(int)
{
float ambient[] = {random(0, 1), random(0, 1), random(0, 1), 1};
float diffuse[] = {random(0, 1), random(0, 1), random(0, 1), 1};
float specular[] = {random(0, 1), random(0, 1), random(0, 1), 1};
(...)
ballMaterials.push_back(Material(ambient, diffuse, specular));
}
有些东西是非常错误的,因为球是扁平的和红色的,而不是随机颜色。我想我已经以错误的方式实现了struct,但我不确定如何修复它(数组成员)。你可以帮帮我吗?
答案 0 :(得分:2)
我将扩展我对std::array用法的评论,并向您展示您尝试做的示例,而是使用std::array
:
#include <array>
#include <vector>
typedef std::array<float, 4> FloatArray4;
struct Material
{
FloatArray4 ambient, diffuse, specular;
Material(const FloatArray4& ambient_, const FloatArray4& diffuse_,
const FloatArray4& specular_) : ambient(ambient_), diffuse(diffuse_), specular(specular_){}
FloatArray4& Ambient() { return ambient; }
FloatArray4& Diffuse() { return diffuse; }
FloatArray4& Specular() { return specular; }
};
float random(float minVal, float maxVal)
{
return minVal + static_cast<float> (rand()) / static_cast<float> (RAND_MAX / (maxVal - minVal));
}
std::vector<Material> ballMaterials;
void createBall(int)
{
FloatArray4 ambient = {{random(0, 1), random(0, 1), random(0, 1), 1}};
FloatArray4 diffuse = {{random(0, 1), random(0, 1), random(0, 1), 1}};
FloatArray4 specular = {{random(0, 1), random(0, 1), random(0, 1), 1}};
ballMaterials.push_back(Material(ambient, diffuse, specular));
}
void drawBall(float radius, Vector3& position, Material material, Rigidbody rigidbody)
{
glMaterialfv(GL_FRONT,GL_AMBIENT,material.Ambient().data());
glMaterialfv(GL_FRONT,GL_DIFFUSE,material.Diffuse().data());
glMaterialfv(GL_FRONT,GL_SPECULAR,material.Specular().data());
}
int main()
{
createBall(10);
}
请注意,没有指针需要处理。
std::array
通过引用传递,并且在返回数组的函数上,返回对现有std::array
的引用。如果这是另一项要求,您可以添加其他函数来返回std::array
的副本。
另外,请注意std::array::data()
函数,该函数可以访问基础数组。
答案 1 :(得分:1)
您的原始结构包含对数组的引用(这是&符号在成员声明中的作用。)这意味着数组实际上并不在结构中。它们在内存中的其他位置,并且结构包含指向其实际位置的隐藏指针(引用=隐藏指针[但不要告诉任何人])
因此,只要真实数组有效,您的结构才有效。由于您在CreateBall方法中为它们分配了局部变量,因此只要从此方法返回,结构就不再有效。 任何都可能发生。
最简单的解决方案是切换到使用std::array<float, 4>
来声明您的成员。它为您处理所有杂乱的细节。如果您不想采用这种方法,则必须声明没有符号的成员数组,并实际将浮点数从构造函数的参数复制到成员数组中的项目中。
注意:
其他人在评论中指出了这一点。我只是将其合并到一个答案中(请注意,如果您发表了其中一条评论并希望代表,请随时发布答案,我将删除我的答案。)