Вы можете избежать ошибок компиляции, если вы удалите определения метода из файлов заголовков и пусть классы содержат только декларации методов и объявления / определения переменных. Определения методов должны быть помещены в файл .cpp (как говорится в рекомендациях по лучшей практике).
Нижняя сторона следующего решения (при условии, что вы поместили методы в файл заголовка для inline их), что методы больше не встроены в компилятор, и попытка использования ключевого слова inline создает компоновщик ошибки.
//A.h
#ifndef A_H
#define A_H
class B;
class A
{
int _val;
B* _b;
public:
A(int val);
void SetB(B *b);
void Print();
};
#endif
//B.h
#ifndef B_H
#define B_H
class A;
class B
{
double _val;
A* _a;
public:
B(double val);
void SetA(A *a);
void Print();
};
#endif
//A.cpp
#include "A.h"
#include "B.h"
#include <iostream>
using namespace std;
A::A(int val)
:_val(val)
{
}
void A::SetB(B *b)
{
_b = b;
cout<<"Inside SetB()"<<endl;
_b->Print();
}
void A::Print()
{
cout<<"Type:A val="<<_val<<endl;
}
//B.cpp
#include "B.h"
#include "A.h"
#include <iostream>
using namespace std;
B::B(double val)
:_val(val)
{
}
void B::SetA(A *a)
{
_a = a;
cout<<"Inside SetA()"<<endl;
_a->Print();
}
void B::Print()
{
cout<<"Type:B val="<<_val<<endl;
}
//main.cpp
#include "A.h"
#include "B.h"
int main(int argc, char* argv[])
{
A a(10);
B b(3.14);
a.Print();
a.SetB(&b);
b.Print();
b.SetA(&a);
return 0;
}
Если я правильно понял ваш вопрос, вы хотите построить две вещи на одном и том же axes
без совместного доступа axis
. Вероятно, есть лучший способ сделать это, но вы можете установить twinx
(doc) и twiny
(doc) как таковые
ax # your first axes
ax_new = ax.twinx().twiny()
Который даст вам отметки по всем сторонам сюжета. ax
будет зависеть от нижней и левой сторон, ax_new
будет зависеть от верхнего и правого.