我是一个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按钮,但我对如何同时编译两个文件毫无头绪。
试着这么做。 这对我很有效,给出了我想要的结果:
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中尝试过您的代码,并且它运行良好。
请确保您正在创建正确的项目类型。 我创建了一个空项目并尝试。