提问者:小点点

。h和。cpp文件分离时出错,但仅使用。h文件时没有出错。 我做错了什么?


我是一个C++新手,所以如果我的疑问太小的话,请不要太在意我。

#pragma once

class cube
{
public:
    double getVolume();
    double getSA();
    void setLength(double length);

private:
    double length_;
};

这是我的头文件多维数据集。h^^^

#include "cube.h"

double cube::getVolume()
{
    return length_ * length_ * length_;
}

double cube::getSA()
{
    return 6 * length_ * length_;
}

void cube::setLength(double length)
{
    length_ = length;
}

这个是cube.cpp,下一个是main.cpp

#include "cube.h"
#include <iostream>
int main()
{

    cube c;

    c.setLength(3.48);
    double vol = c.getVolume();
    std::cout << "Vol: " << vol;

    return 0;
}

问题1:所以当我在不使用。cpp的情况下将实现包含在。h文件本身中时,代码会按预期运行。 但是当我将。h和。cpp文件分开时,会出现一个错误:“对Cube::SetLength(double)的未定义引用”,“对Cube::GetVolume()'的未定义引用”和“在0.47秒内退出代码=1”。

我在VS代码上运行了它,并且只是设置了它,并且只是运行了一个简单的CIN/COUT和一个hello world程序。 是代码本身有什么问题,还是VS代码导致的错误? 请注意,只有当我将。h和。cpp文件分开时,才会出现这个问题。

问题2:为什么要将。h和。cpp文件分开?

编辑1:正如@Kamilcuk指出的,问题可能是链接main.cpp和cube.cpp文件,但我不知道如何链接cpp文件进行编译?

编辑2:我只是可能编译的方式不对。 我通常只需单击右上方的Code Runner enabled run按钮,但我对如何同时编译两个文件毫无头绪。


共2个答案

匿名用户

试着这么做。 这对我很有效,给出了我想要的结果:

G++main.cpp cube.cpp-I./cube.h-o cube.out

您也可以在。h文件中内联实现,并且可以使您的代码正常工作。 但是对于更复杂的类,最好将。cpp和。h中的实现分开。

同时,保护多个定义的头文件也是一种很好的做法:

#ifndef _CUBE_H_
#define _CUBE_H_

class Cube
{
   public:
    double getVolume();
    double getSA();
    void setLength(double length);

   private:
    double length_;
 };

 #endif //_CUBE_H_

匿名用户

删除#pragma一次,它应该可以工作。 以前我也遇到过类似的问题。
编辑过:
我已经在我的VS中尝试过您的代码,并且它运行良好。
请确保您正在创建正确的项目类型。 我创建了一个空项目并尝试。

相关问题