gpt4 book ai didi

c++ - C++中的多个类定义错误,我的头文件有问题吗?

转载 作者:行者123 更新时间:2023-11-30 03:19:52 25 4
gpt4 key购买 nike

我只在一个 .hpp 文件中声明该类一次,并在另一个 .cpp 文件中实现其成员函数。该顺序的 .cpp 和 .hpp 文件如下。我在 .cpp 文件中收到错误。第一个是在第 6 行,上面写着“complex::complex 的多个定义”和“这里首先定义”这对每个函数都会发生,包括重载的 ctor。当我尝试将它们的原型(prototype)包含在 .hpp 文件中时,我是否无意中将所有这些函数定义了两次?

只要我在使用该类的主文件中包含 .hpp 文件而不是 .cpp,我就不会出错。这有什么意义?编译器如何访问包含所有函数定义的 .cpp 文件?

#include <iomanip>      // For fixed, setprecision()
#include <sstream> // For stringstream class
#include "Complex.hpp" // For the complex class declaration


complex::complex()
{
init(0,0);
}

complex::complex(double init_real, double init_imag)
{
init(init_real, init_imag);
}


double complex::get_imag()
{
return m_imag;
}


double complex::get_real()
{
return m_real;
}


//--------------------------------------------------------------------------------------------------
void complex::init(double init_real, double init_imag)
{
m_real = init_real;
m_imag = init_imag;
}

void complex::set_imag(double s)
{
m_imag = s;
}
-
void complex::set_real(double s)
{
m_real = s;
}


std::string complex::to_string()
{
std::stringstream sout;
sout << std::fixed << std::setprecision(4);
sout << "(" << get_real();
double imag = get_imag();
if (imag < 0) {
sout << " - " << -imag << 'i';
} else if (imag > 0) {
sout << " + " << imag << 'i';
}
sout << ")";
return sout.str();
}

#ifndef COMPLEX_HPP  // See the comments in the header comment block regarding these two lines.
#define COMPLEX_HPP

#include <string> // Included because we are using the string class in to_string()
class complex
{
public:

complex();

complex(double , double);

double get_imag();

double get_real();

void set_imag(double);

void set_real(double);

std::string to_string();

private:

void init(double , double );

double m_real;

double m_imag;
};

#endif

使用这些的主文件:

#include <fstream> // For ofstream class declaration
#include <iostream> // For cout, endl
#include "Complex.hpp" // So we can access the complex class declaration (hint: see Complex.cpp)
#include <string>


int main()
{
std::string filename; filename = "complex-test.txt";
std::ofstream...
.
.
.
return 0;
}

最佳答案

包含一个 cpp 文件等同于导入该文件中的定义。这意味着您在实际定义它的 cpp 文件中有一个定义,并且该定义静默地进入您包含的文件中。这样,链接器会为同一函数生成 2 个定义拷贝,并且会感到困惑。编译应该没问题,但链接会导致问题。尝试避免 #include 中的 cpp 文件

关于c++ - C++中的多个类定义错误,我的头文件有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53357116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com