I wanted to make a friendship between 2 classes by using the method from one class. Even I looked into different tutorials and books and I can't make it works.
Edit :: It works in one file, but I want to make it in separated files - what unfortunately can't do:
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;
}
I got errors:
"error: invalid use of incomplete type ‘class base’
while (getline(b.file, line)) {".
"forward declaration of ‘class base’
class base;"
The prototype/definition of the function being given friendship access must exist when the friend
reference is declared. Fixed code (with includes):
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
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;
};
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;
};
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::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();
}
int main()
{
base b("/home/Sempron/Desktop/code");
Tbase_in_memory a;
a.read_to_arrays(b);
return 0;
}
Ideally, the two classes would be declared in different header files, so you must watch the include order carefully.
In the file Tbase_in_memory.cpp
, you need to also include base.h
. Then you can remove the forward declaration in the cpp file.
#include "Tbase_in_memory.h"
#include "base.h"
using namespace std;
Tbase_in_memory::Tbase_in_memory(int s)
{
//...
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.