从类向量变量获取值

时间:2019-03-17 15:14:18

标签: c++ raytracing

我正在尝试为给定骨架代码中的球体实现光线跟踪算法

要计算Delta,我想使用球体的半径和中心。我正在将Scene类的对象导入:

void render(image2D<float4>& framebuffer, const Scene& scene, float w_s, float 
f, const float4& background_color)

Scene确实是这样的:

class Scene
{
    Scene(const Scene&) = default;
    Scene& operator =(const Scene&) = default;
    std::vector<Sphere> spheres;
public:
    Scene() = default;
    void addSphere(const float3& c, float r);
};

所以类Scene包含一个向量<Sphere>,其中Sphere看起来像这样:

struct Sphere
{
    float3 c;
    float r;
};

所以我试图像这样从导入Sphere获取中心和半径

std::cout << "Sphere radius: " << scene.spheres.(0).r << std::endl;

但是我得到scene.spheres是私人的。我们不允许更改.h文件。我该如何处理以获取每个球体对象的cr的值?

3 个答案:

答案 0 :(得分:1)

如果您有权访问spheres,则可以输入:

std::cout << "Sphere radius: " << scene.spheres[0].r << std::endl;

或更好:

for (auto& x: scene.spheres)
    std::cout << "Sphere radius: " << x.r << std::endl;

但是spheresScene的私有对象,除非您可以更改Scene的定义并在{{1}上提供迭代器,否则您将无法访问它。 },或spheres的吸气剂,或使render函数成为该类的朋友。

答案 1 :(得分:0)

你不能。

该类使您无法访问其内容,并且如果无法更改它,那么您将没有解决方案。

那是一个设计很差的课程。

答案 2 :(得分:0)

有一种简单但不可否认的解决问题的方法。我不能完全同意其中一项说法,即这是一个糟糕的设计。但是,如果不允许您触摸头文件,从而更改$user = User::find(2); $user->payments()->create( [ 'resnumber' => 'dwwe', 'price' => '1111', 'invoice_id' =>'asdasd', 'month_key' => 'k8Cv2YfuO4jOLXd', 'month_id' => 6, 'payment' => false ] ); dd($user->payments); 类的设计,那么您可以这样做。

您的raytracer不必说出具体对象。它所需要的只是它们的属性值。但是,当向量为私有时,您将无法获得。这是事实。但是,没有什么可以阻止您创建重复矢量并将其用于将值传递到场景矢量 并使用该重复矢量来访问属性数据。

Scene

它可以工作,但是此解决方案的问题是您需要维护2个向量。不只是一个。

示例代码:https://rextester.com/UEOKN35523