C++ 在不同的.cpp文件中使用main.cpp中创建的类型的对象

C++ 在不同的.cpp文件中使用main.cpp中创建的类型的对象,c++,C++,我试图使用在main中创建的Node节点向量。类节点也包含在main.cpp中。我有一个单独的.cpp和.h文件用于DFS搜索功能(我的教授要求它的结构如下)。我的函数的返回类型将是一个向量,但编译器无法确定节点是什么。如何在DFS搜索功能中使用节点?我使用了extern关键字,但无法让它帮助我。为清楚起见,以下是一些示例代码: Main.cpp #include "DFS.h" //other include statements using namespace std;

我试图使用在main中创建的
Node
节点向量。类
节点
也包含在main.cpp中。我有一个单独的.cpp和.h文件用于DFS搜索功能(我的教授要求它的结构如下)。我的函数的返回类型将是一个
向量
,但编译器无法确定
节点
是什么。如何在DFS搜索功能中使用节点?我使用了extern关键字,但无法让它帮助我。为清楚起见,以下是一些示例代码:

Main.cpp

#include "DFS.h"
//other include statements
using namespace std; 

 Node::Node(int id, vector<float> vec){
        this->nodeID = id;
        this->posVals = vec;  
    }
    
int Node::getNodeID(){
        return nodeID;
   }


int main(){
    vector<Node> nodeContainer;
    nodeContainer = load(); //load function reads in a file and dynamically creates nodes and
                            //pushes them to a vector that is returned to main
                 
    cout << "\n\n\n Adjacency List: \n" << endl; //I make an adjacency list of all the data
    AdjList adjList(nodeContainer);
    adjList.makeAdjList();
   

    dfsISearch(srcNode, destinationNode);  //function from DFS
}
vector<Node> dfsISearch(int src, int dest){
        vector<Node> vectorPath;
        return vectorPath;
    }
#包括“DFS.h”
//其他包括声明
使用名称空间std;
Node::Node(int-id,vector-vec){
此->节点id=id;
此->posVals=vec;
}
int节点::getNodeID(){
返回节点ID;
}
int main(){
向量节点容器;
nodeContainer=load();//load函数读入文件并动态创建节点和
//将它们推送到返回到主节点的向量

cout您需要使用节点类创建一个单独的文件(即Node.hpp),然后将其包含在任何其他需要的文件中。

您需要使用节点类创建一个单独的文件(即Node.hpp),然后将其包含在任何其他需要的文件中

您的主函数不应该包含函数/类,而应该仅控制它们。正确的方法是在头文件中声明它,然后在您希望使用它们的任何其他位置包含“headerfile.h”

例如:

良好做法 头文件

#pragma once

class Entity
{
private:
    int num;

public:
    std::string name;
    void set_num(int);
};

extern int a;

int add(int,int);

headerfile.cpp

#包括“headerfile.h”
void实体::set_num(int n)
{
num=n;
}
int a=5;//a的定义
int add(int a,int b)//add(int,int)的定义
{
返回a+b;
}  
main.cpp

#包括“headerfile.h”//注意:不包括cpp文件,但包括.h文件
int main()
{
实体e;
标准::cout
您的主函数不应该包含函数/类,而应该仅控制它们。正确的方法是在头文件中声明它,然后在您希望使用它们的任何其他位置包含“headerfile.h”

例如:

良好做法 头文件

#pragma once

class Entity
{
private:
    int num;

public:
    std::string name;
    void set_num(int);
};

extern int a;

int add(int,int);

headerfile.cpp

#包括“headerfile.h”
void实体::set_num(int n)
{
num=n;
}
int a=5;//a的定义
int add(int a,int b)//add(int,int)的定义
{
返回a+b;
}  
main.cpp

#包括“headerfile.h”//注意:不包括cpp文件,但包括.h文件
int main()
{
实体e;

std::您是否需要在DFS.h中定义
类节点
。我该怎么做?
类节点{//all function and member variables};
,因为我刚刚这样做了,它说“在main.cpp中重新定义节点,在DFS.h中以前的定义”是这样吗,我现在只需要将定义从main中删除?是的,如果将
节点的声明移动到
DFS.h
文件中,则必须将该声明从
main.cpp
中删除,并将其替换为
#include“DFS.h”
语句。既然我已经这样做了,那么当我尝试编译main.cpp:Undefined symbols for architecture x86_64:“DfseSearch(int,int)”,引用自main-d87357中的:_main。ld:symbol未找到架构x86_64 clang:error:linker命令失败,退出代码为1(使用-v查看调用)为什么main.cpp中还有一个定义?你需要在DFS.h中定义
类节点
。我该怎么做?
类节点{///所有函数和成员变量};
,因为我刚刚这样做了,它说“重新定义main.cpp中的节点,DFS.h中以前的定义”是这样吗,我现在只需要将定义从main中删除?是的,如果将
节点的声明移动到
DFS.h
文件中,则必须将该声明从
main.cpp
中删除,并将其替换为
#include“DFS.h”
语句。既然我已经这样做了,那么当我尝试编译main.cpp:Undefined symbols for architecture x86_64:“DfseSearch(int,int)”,引用自main-d87357中的:_main。ld:symbol未找到架构x86_64 clang:error:linker命令失败,退出代码为1(使用-v查看调用)为什么你在main.cpp中仍然有一个定义?为什么不好的实践方式是一个不好的方式?是因为所有的逻辑都被重新包含了,而你真正需要的是函数和变量的定义吗?@CrashMan123还有,如果你觉得我的答案有帮助的话,如果你能支持的话,我将不胜感激。我还没有解决我的问题,我做了一个他main中的
节点
类的aderfile,我将其包括在main中以及DFS.cpp和DFS.h中(因为节点位于函数定义中),但现在我在尝试编译main.cpp:architecture x86的未定义符号时遇到此错误。\u 64:“DFISearch(int,int)”,引用自:_main-d87357中的main。o ld:symbol(s)找不到体系结构x86_64 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)@CrashMan123你主要不需要定义,只需要在头文件中声明,然后在cpp文件中定义。为什么不好的实践方式是一种不好的方式?是因为所有的逻辑都被再次包含,而你真正需要的是函数和变量的定义吗?@CrashMan123同样,如果你觉得我的答案有帮助,我将不胜感激我还没有解决我的问题,我在main中为
节点
类创建了一个headerfile,并将其包含在main、DFS.cpp和DFS.h中(因为节点在函数定义中),但现在我在尝试编译main.cpp时遇到了这个错误:架构x86_64的未定义符号:“dfsISearch(int,int)”,引用自:_main-d87357中的main。o ld:未找到的符号
#pragma once

class Entity
{
private:
    int num;

public:
    std::string name;
    void set_num(int);
};

extern int a;

int add(int,int);