vs2019中的实现了的类无法正确使用


#pragma once
#ifndef RAY_H
#define RAY_H

#include"vec3.h"

class ray {
public:
    point3 orig;
    vec3 dir;
public:
    ray() {}
    ray(const point3& origin, const vec3& direction) :orig(origin), dir(direction) { }

    point3 origin() const { return orig; }
    vec3 direction() const { return dir; }

    point3 at(double t) const {
        return orig + t * dir;
    }

};
#endif

这段代码在vs2019中编译的时候遇到如下错误,有没有人知道为什么会这样,明明类也没写错而且每个其他文件都引入了ray.h了,不懂为什么会说direction()等成员函数不是成员

img

vec3.h"代码贴一下,里面有没有point3的定义,另外
#pragma once

#ifndef RAY_H
#define RAY_H
...
#endif
两者的作用一样的,只要写一种就可以了。

去检查一下有没有中英文符号;和;混用,还有{},主要是这两个容易不小心切换没注意,有些问题就是中英文符号问题,导致后面的都没法实现。仅凭这一段代码无法判断你的具体问题,你要把你那个poin3t类和vec3类的内部结构(也就是你类的内部成员及成员函数声明)得告诉别人,具体实现不用贴出来,否则很难判断

  • 以下回答由chatgpt基于相关博客总结生成:

    如果您遇到了错误,我可以尝试帮助您解决问题。请提供更多关于错误的描述,包括具体的错误信息和出现错误的代码行数。此外,提供一些当前的上下文信息,例如您用到的库或框架,这将帮助我更好地理解您的问题并提供准确的解决方案。

    如果您不能提供更多的细节,我可以根据参考资料给出基本的广度优先遍历和深度优先遍历的代码实现。以下是示例代码:

    广度优先遍历代码示例:

    import java.util.LinkedList;
    import java.util.List;
    import java.util.Map;
    import java.util.Queue;
    import java.util.stream.Collectors;
    
    public class BFSExample {
        public static void startBfs(Map<String, List<String>> graph, String start) {
            // 创建一个队列,用于存放待访问的顶点
            Queue<String> queue = new LinkedList<>();
            // 创建一个集合,用于存放已访问过的顶点
            List<String> visited = new LinkedList<>();
    
            // 将起始顶点添加到队列和已访问列表中
            queue.offer(start);
            visited.add(start);
    
            // 开始广度优先遍历
            while (!queue.isEmpty()) {
                // 取出队首顶点
                String vertex = queue.poll();
                System.out.print(vertex + " ");
    
                // 获取当前顶点的可达顶点
                List<String> directAccessPoints = graph.get(vertex);
                if (directAccessPoints != null) {
                    // 过滤掉已访问过的顶点
                    List<String> unvisitedPoints = directAccessPoints.stream()
                            .filter(item -> !visited.contains(item))
                            .collect(Collectors.toList());
    
                    // 将未访问过的顶点添加到队列和已访问列表中
                    queue.addAll(unvisitedPoints);
                    visited.addAll(unvisitedPoints);
                }
            }
        }
    }
    

    深度优先遍历代码示例:

    import java.util.LinkedList;
    import java.util.List;
    import java.util.Map;
    import java.util.Stack;
    import java.util.stream.Collectors;
    
    public class DFSExample {
        public static void startDfs(Map<String, List<String>> graph, String start) {
            // 创建一个栈,用于存放当前路径,用于回退
            Stack<String> stack = new Stack<>();
            // 创建一个集合,用于存放已访问过的顶点
            List<String> visited = new LinkedList<>();
    
            // 将起始顶点添加到栈和已访问列表中
            stack.push(start);
            visited.add(start);
    
            // 开始深度优先遍历
            while (!stack.isEmpty()) {
                // 取出栈顶顶点
                String vertex = stack.peek();
                System.out.print(vertex + " ");
    
                // 获取当前顶点的可达顶点
                List<String> directAccessPoints = graph.get(vertex);
                if (directAccessPoints != null) {
                    // 过滤掉已访问过的顶点
                    List<String> unvisitedPoints = directAccessPoints.stream()
                            .filter(item -> !visited.contains(item))
                            .collect(Collectors.toList());
    
                    // 遍历未访问过的顶点,对其进行深度优先遍历
                    for (String point : unvisitedPoints) {
                        stack.push(point);
                        visited.add(point);
                    }
                } else {
                    // 当前顶点已无路可走,弹栈回退
                    stack.pop();
                }
            }
        }
    }
    

    请注意,这些代码只是基本的示例实现,具体的解决方案可能需要根据您提供的更多详细信息进行调整和定制。如果您能提供更多错误描述和上下文信息,我将能够更准确地帮助您解决问题。

总结了一下,主要有以下原因:

1.(此情况经常出现在大型工程项目中)如果存在两个类的头文件a.h和b.h,在a.h中有这样的语句:#include "b.h",在b.h文件中有这样的语句:#include "a.h" 且在一个类中有另一个类的对象时 那么就会出现这样的错误。

2.没有包含要定义的类的头文件。

3.项目中少加了宏定义,导致头文件重复定义或相应宏无法识别。

4.当有多个头文件时,顺序写反也可能导致相关的错误,其根本是头文件中的预编译语句被隐去了。

例如:

#include <stdio.h>

#include <Windows.h>

#include <WinCrypt.h>

#include <string.h>

如果把第二个和第三个写反,一个宏定义就被#if给注了,就会出现类似错误。

具体参考下这篇文章:
https://www.cnblogs.com/zhangjing0502/archive/2012/02/29/2373814.html

需要确认你的C++环境搭建的是正确的。输出报错信息优先解决第一个,后面有可能是第一个报错引起的

看.h代码的话好像没有问题,还是要看报错的文件是否没包含vec3.h头文件。

主要都是一些语法层面的错误,仔细检查下类型匹配,参数匹配,属性访问等问题

vs2019中的实现了的类正确使用
可以参考下

direction()的定义在哪里呢?如果在另一个类里,要继承过来。如果是个结构体,要把头文件添加过来。

请确保在使用Ray类时,没有与其他命名空间中的同名类或函数发生冲突。
确保在Ray类的定义中,先声明了vec3类,然后再声明ray类。因为ray类使用了vec3类的成员函数,所以需要在ray类之前声明vec3类

引入不正确或者存在冲突

检查一下语法

每一次解答都是一次用心理解的过程,期望对你有所帮助。
参考结合AI智能库,如有帮助,恭请采纳。

根据提供的代码和描述,可能出现这个错误的原因是头文件包含顺序的问题。在代码中,你在 ray.h 文件中包含了 vec3.h 文件,但是在 vec3.h 文件中可能先包含了 ray.h 文件,这就导致了在 vec3.h 文件中定义的 ray 类在 ray.h 文件被包含之前已经定义过了,从而导致编译器错误地认为 ray 类已经在其他地方定义过了,而无法找到 direction() 等成员函数。

要解决这个问题,可以尝试将 #include "vec3.h" 从 ray.h 文件中移动到 ray 类的定义之前,或者将 #include "vec3.h" 改为 #include <vec3.h>,以指示编译器在标准头文件中查找 vec3.h 文件。

此外,还需确保在编译器的包含路径中正确设置了 vec3.h 文件的路径,以便编译器可以找到它。
修改 后的代码参考:

#pragma once  
#ifndef RAY_H  
#define RAY_H  
  
class point3;  
class vec3;  
  
class ray {  
public:  
    point3 orig;  
    vec3 dir;  
  
public:  
    ray() {}  
    ray(const point3& origin, const vec3& direction) :orig(origin), dir(direction) {}  
  
    point3 origin() const { return orig; }  
    vec3 direction() const { return dir; }  
  
    point3 at(double t) const {  
        return orig + t * dir;  
    }  
};  
  
#endif