對于一個分配,我得到了一個不同類的框架,這些類使用通過常量參考傳遞的引數。當我初始化同一個類的一個實體,然后再初始化第二個實體時,在第一個實體中通過 const 參考傳遞的成員的值會發生變化。
我不允許改變a_cameras。有什么我可以在類定義中做的事情,這樣我就可以避免值自己改變嗎?
的初始化PerspectiveCamera:
#include <core/image.h>
#include <core/point.h>
#include <core/vector.h>
#include <core/scalar.h>
#include <core/julia.h>
#include <rt/ray.h>
#include <rt/cameras/perspective.h>
#include <rt/cameras/orthographic.h>
#include <iostream>
#include <rt/renderer.h>
using namespace rt;
void a_cameras() {
Image img(800, 800);
Image low(128, 128);
PerspectiveCamera pcam(Point(0, 0, 0), Vector(1, 0, 0.1f), Vector(0, 0, 1), pi/3, pi/3);
Renderer r1(&pcam,0);
r1.test_render2(img);
r1.test_render2(low);
img.writePNG("a1-2.png");
low.writePNG("a1-2-low.png");
PerspectiveCamera pcam2(Point(0, 0, 0), Vector(0.5f, 0.5f, 0.3f), Vector(0, 0, 1), pi * 0.9f, pi * 0.9f);
Renderer r12(&pcam2,0);
r12.test_render2(img);
img.writePNG("a1-3.png");
OrthographicCamera ocam(Point(0, 0, 0), Vector(0.1f, 0.1f, 1), Vector(0.2f, 1.0f, 0.2f), 10.f, 10.f);
Renderer r2(&ocam,0);
r2.test_render2(img);
img.writePNG("a1-4.png");
}
的定義PerspectiveCamera
perspective.cpp:
#include <rt/cameras/perspective.h>
#include <cmath>
#include <core/matrix.h>
namespace rt {
PerspectiveCamera::PerspectiveCamera(const Point& center, const Vector& forward, const Vector& up, float verticalOpeningAngle, float horizontalOpeningAngle)
: center(center), forward(forward)
{
vertFactor = tanf(verticalOpeningAngle / 2.0f);
horFactor = tanf(horizontalOpeningAngle / 2.0f);
x_axis = cross(forward, up).normalize();
up_axis = cross(x_axis, forward).normalize();
//vertFactor = tanf(verticalOpeningAngle / 2.0f);
//horFactor = tanf(horizontalOpeningAngle / 2.0f);
}
Ray PerspectiveCamera::getPrimaryRay(float x, float y) const {
printf("center: (%f, %f, %f); forward: (%f, %f, %f); x_axis: (%f, %f, %f); up_axis: (%f, %f, %f)\n",
center.x, center.y, center.z,forward.x, forward.y, forward.z, x_axis.x, x_axis.y, x_axis.z, up_axis.x, up_axis.y, up_axis.z);
Vector direction = x * x_axis * horFactor y * up_axis * vertFactor forward;
return {center, direction};
}
}
perspective.h:
#ifndef CG1RAYTRACER_CAMERAS_PERSPECTIVE_HEADER
#define CG1RAYTRACER_CAMERAS_PERSPECTIVE_HEADER
#include <rt/cameras/camera.h>
#include <core/vector.h>
#include <core/point.h>
namespace rt {
class PerspectiveCamera : public Camera {
public:
PerspectiveCamera(
const Point& center,
const Vector& forward,
const Vector& up,
float verticalOpeningAngle,
float horizontalOpeningAngle
);
virtual Ray getPrimaryRay(float x, float y) const;
const Point ¢er;
const Vector &forward;
Vector x_axis;
Vector up_axis;
float vertFactor;
float horFactor;
};
}
#endif
謝謝你,簡
uj5u.com熱心網友回復:
你的代碼比較復雜。盡管要看到假設:“const 參考不會改變其值”需要的少得多。是基于一種誤解。
#include <iostream>
struct foo {
const int& x;
};
int main()
{
int a = 42;
foo f{a};
a = 0;
std::cout << f.x;
}
這個輸出0即使f.x是用awhen初始化a了值42。f持有對 的常量參考a。這僅意味著您不能修改avia f.x。這并不意味著x不能通過其他方式進行修改。常量參考不是對常量的參考!
uj5u.com熱心網友回復:
來自 463035818_is_not_a_number 的答案說的是絕對正確的。
但就您而言,我認為您的問題在于您正在存盤對臨時變數的參考。
你有:
const Point ¢er;
并且你正在用Point(0,0,0).
你可以改變你宣告你的成員的方式,從const Point ¢er;到Point center;和從const Vector &forward;到Vector forward;
這樣您就不會存盤參考,而是存盤這些物件的實際副本。您可以保留const您認為對這些成員必不可少的修飾符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/368666.html
上一篇:C :不同類初始化后變數改變值
