C++软光栅报错,无法访问成员

我想定义一个四维向量,在最后对运算符+的实现出现了问题,代码如下:

#pragma once
#include <stdexcept>
#include <intrin.h>
#include "Preprocessor.h"


class Vector4
{
public:
    Vector4(float vx, float vy, float vz, float vw);
    Vector4();
    Vector4(float vx, float vy, float vz);

    __forceinline explicit Vector4(__m128 m) :Vector4(m.m128_f32[0], m.m128_f32[1], m.m128_f32[2], m.m128_f32[3]) {}

    Vector4 operator+(const Vector4& right)const;
    Vector4 operator-(const Vector4& right)const;
    Vector4 operator*(float right)const;
    Vector4 operator/(float right)const;

    float SquareMagnitude();
    float Magnitude();
    Vector4& Normalize();

    float static Dot(const Vector4& left, const Vector4& right);
    float  Dot(const Vector4& right);
    Vector4 static Cross(const Vector4& left, const Vector4& right);
    Vector4 static Lerp(const Vector4& left, const Vector4& right, float t);
    void standardization()
    {
        if (w == 0)
        {
            //std::cout << "error w==0" << std::endl;
            return;
        }
        x /= w;
        y /= w;
        z /= w;
        w = 1;
        
    }
    void Print();

    __m128 getM128()
    {
        return _mm_set_ps(x, y, z, w);
    }

    __forceinline float& operator[](int index);
    

private:
    float x, y, z, w;
};


Vector4::Vector4(float vx, float vy, float vz, float vw) :x(vx), y(vy), z(vz), w(vw) {}
Vector4::Vector4() : Vector4(0, 0, 0, 1) {}
Vector4::Vector4(float vx, float vy, float vz) :Vector4(vx, vy, vz, 1) {}



// 报错,无法访问this中的getM128函数,right更是什么成员都访问不到
Vector4 Vector4::operator+(const Vector4& right)const
{
    return Vector4(_mm_add_ps(this.getM128(), right.getM128()));
}


报错:

img

img


解决了,不应该加上this指针,或者将函数声明为__m128 getM128()const;

试试:

Vector4 Vector4::operator+(const Vector4& right)const
{
    return Vector4(_mm_add_ps(this->getM128(), right.getM128()));
}
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7620714
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:信息学奥赛一本通(C++)在线评测系统——基础(二)基础算法 —— 1313:【例3.5】位数问题
  • 您还可以看一下 夏曹俊老师的C++ 11 14 17 20内存管理-指针、智能指针和内存池课程中的 图示进程的内存空间划分分析代码区_堆栈_内核空间小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    对于报错原因无法确定,需要看具体的报错信息,以及四维向量类的具体实现代码。可能是定义的四维向量类中缺失了相应的成员变量或者运算符函数,或者代码中存在语法错误等问题。

    一般定义四维向量类,需要定义成员变量x、y、z、w,同时重载"+"运算符方法,可以从以下两种方式中选择实现:

    1. 以成员函数的方式,实现运算符“+”的重载:
    class FourDimensionalVector {
    public:
        FourDimensionalVector(double i, double j, double k, double l) {
            x = i;
            y = j;
            z = k;
            w = l;
        }
        FourDimensionalVector operator+(FourDimensionalVector& vec) {
            FourDimensionalVector res(x + vec.x, y + vec.y, z + vec.z, w + vec.w);
            return res;
        }
    private:
        double x;
        double y;
        double z;
        double w;
    };
    
    1. 以友元函数的方式,实现运算符“+”的重载:
    class FourDimensionalVector {
    public:
        FourDimensionalVector(double i, double j, double k, double l) {
            x = i;
            y = j;
            z = k;
            w = l;
        }
        friend FourDimensionalVector operator+(FourDimensionalVector& vec1, FourDimensionalVector& vec2) {
            FourDimensionalVector res(vec1.x + vec2.x, vec1.y + vec2.y, vec1.z + vec2.z, vec1.w + vec2.w);
            return res;
        }
    private:
        double x;
        double y;
        double z;
        double w;
    };
    

    注意:以上代码中定义的“FourDimensionalVector”类仅供参考,实际代码会因需求不同而有所不同。