我是C ++的新手,所以如果一切都还不尽人意,我会向您道歉。
下面是我主要功能的前几行。我在第六行收到一个错误:“在c1之前缺少模板参数”。如您在下面进一步看到的,“复杂”类必须将数据成员加倍,这两个成员都应使用默认构造函数初始化为0。输入complex可以解决此错误,但我不认为我首先需要模板。另一个问题是,在进行此更改之后,编译器无法识别我怀疑使用c1.get_real()
的第一个成员函数,我怀疑这是由于添加了模板参数。
#include <fstream> // For ofstream class declaration
#include <iostream> // For cout, endl
#include <Complex> // So we can access the complex class declaration (hint: see Complex.cpp)
#include <string>
int main()
{
string filename; filename = "complex-test.txt";
ofstream fout(filename.c_str());
fout<<"Defining complex object c1 and calling default ctor"<<endl;
complex c1;
fout<<"Testing accessors and that default ctor initialized c1 to 0 + 0i"<<endl;
fout<<"c1.get_real() returned "<<c1.get_real()<<endl;
实现我的类成员函数的我的Complex.cpp文件:
#include <iomanip> // For fixed, setprecision()
#include <sstream> // For stringstream class
#include "Complex.hpp" // For the complex class declaration
using namespace std;
//--------------------------------------------------------------------------------------------------
// + complex() :
// PSEUDOCODE
// Call init() passing 0 and 0 as the arguments.
//--------------------------------------------------------------------------------------------------
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;
}
//--------------------------------------------------------------------------------------------------
// + to_string() : string
//
// DESCRIPTION
// Returns a string representation of the complex object. For example, if m_real is -2.3333333
// and m_imag is -21.456789123, this function will return the string "(-2.3333 - 21.4568i)".
//
//--------------------------------------------------------------------------------------------------
string complex::to_string()
{
stringstream sout;
sout << fixed << 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()
using namespace std;
class complex
// Write the public section of the class declaration.
{
public:
complex();
complex(double , double);
double get_imag();
double get_real();
void set_imag(double);
void set_real(double);
string to_string();
private:
void init(double, double);
double m_real;
double m_imag;
};
#endif
答案 0 :(得分:4)
如果您在不区分大小写的操作系统(Windows?)上运行编译器,则此行:
#include <Complex> // So we can access the complex class declaration (hint: see Complex.cpp)
将导致包括标准标头<complex>
(全部小写),并因此加载模板std::complex
。请注意,在linux系统上,您将得到正确的错误(找不到带有upaercase的标头Complex)。
然后,您的代码中有两种复杂类型:std::complex
和complex
。您拥有using namespace std
的事实使complex
和std::complex
成为同义词。这是您的错误出处。
首先,如果不需要标准复合体,则不要包含它。因此,在主机中,使用与complex.cpp
中相同的包含:
#include "Complex.hpp" // For YOUR complex class declaration
第二,避免使用using namespace std
。 At least in your headers。只需在标准对象前加上std::
。或列出您明确要使用的标准对象,但不带前缀:using std::cout;
。
附加说明:一些C++ styles建议使用起始大写字母来定义您自己的类名称。这样可以防止与std发生冲突。但是,这种方法不能代替上面的建议,因为使用其他相同样式的库可能会发生名称冲突。