我想通过使用一个班级的方法在2个班级之间建立友谊。即使我研究了不同的教程和书籍,也无法使它起作用。
修改 :: 它可以在一个文件中工作,但我想在单独的文件中进行-不幸的是无法做到这一点:
Tbase_in_memory.h:
#ifndef FRENDY_TBASE_IN_MEMORY_H
#define FRENDY_TBASE_IN_MEMORY_H
#include <iostream>
#include <string>
#include <fstream>
class base;
class Tbase_in_memory
{
public:
Tbase_in_memory(int = 2);
~Tbase_in_memory();
void read_to_arrays(base & b);
private:
std::string *name;
double *price_tag;
int *code;
char *type;
int _size;
};
#endif
Tbase_in_memory.cpp:
#include "Tbase_in_memory.h"
using namespace std;
class base;
Tbase_in_memory::Tbase_in_memory(int s)
{
_size = s;
name = new string[_size];
price_tag = new double[_size];
code = new int[_size];
type = new char[_size];
}
Tbase_in_memory::~Tbase_in_memory()
{
delete[] name;
delete[] price_tag;
delete[] code;
delete[] type;
}
void Tbase_in_memory::read_to_arrays(base & b)
{
string line;
while (getline(b.file, line)) {
cout << line;
}
}
base.h:
#ifndef FRENDY_BASE_H
#define FRENDY_BASE_H
#include <iostream>
#include <string>
#include <fstream>
#include "Tbase_in_memory.h"
class base
{
public:
base(std::string = "...");
~base();
friend void Tbase_in_memory::read_to_arrays(base & b);
private:
std::fstream file;
std::string f_name;
};
#endif
base.cpp
#include "base.h"
using namespace std;
base::base(string n)
{
f_name = n;
file.open(f_name, ios::in);
if (!file.good()) {
cout << "Error";
cout << string(38, '-');
exit(0);
}
}
base::~base()
{
file.close();
}
#include <iostream>
#include "Tbase_in_memory.h"
#include "base.h"
using namespace std;
int main()
{
base b("/home/Sempron/Desktop/code");
Tbase_in_memory a;
a.read_to_arrays(b);
return 0;
}
我遇到了错误:
"error: invalid use of incomplete type ‘class base’
while (getline(b.file, line)) {".
"forward declaration of ‘class base’
class base;"
答案 0 :(得分:1)
在声明new CustomBusinessLogic.Calculator
引用时,必须存在被赋予友谊访问权限的函数的原型/定义。固定代码(包含):
friend
理想情况下,这两个类将在不同的头文件中声明,因此您必须仔细观察包含顺序。
答案 1 :(得分:1)
在文件Tbase_in_memory.cpp
中,您还需要包括base.h
。然后,您可以在cpp文件中删除前向声明。
#include "Tbase_in_memory.h"
#include "base.h"
using namespace std;
Tbase_in_memory::Tbase_in_memory(int s)
{
//...