【发布时间】:2019-09-06 21:09:16
【问题描述】:
我想通过使用一个班级的方法在两个班级之间建立友谊。即使我查看了不同的教程和书籍,我也无法让它发挥作用。
编辑:: 它在一个文件中工作,但我想在单独的文件中制作它 - 不幸的是不能这样做:
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;"
【问题讨论】:
-
当编译器试图解析
friend void Tbase_in_memory::read_to_arrays(base & b);时,没有Tbase_in_memory::read_to_arrays。挖一个骗子。 -
将
Tbase_in_memory的完整声明移到base上方。在Tbase_in_memory上方转发声明class base;。 -
无关:与其在
Tbase_in_memory中分配和维护一小群动态数组,不如考虑将数据聚合到一个结构中并创建一个数组(std::vector,如果你有' em) 的那个结构。vector的额外好处是您不必注意Rule of Three,因为vector遵守五法则。现在,如果您不小心复制了Tbase_in_memory,那么您将陷入痛苦的世界。 -
顺便说一句,不需要欺骗。 @jxh 的解决方案比我发现的任何骗子都优雅。
标签: c++ oop friend friend-function