我对此代码有点问题:
#include <iostream>
class A {
public:
void PrintA() {
std::cout << "A";
}
};
class B : public A {
public:
void PrintB() {
std::cout << "B";
}
};
int main() {
A a;
a.PrintA();
B b;
b.PrintA();
b.PrintB();
system("PAUSE");
}
你能告诉我是否有办法在A类中定义一个对象B并使用它的方法如下:
class A {
public:
void PrintA() {
std::cout << "A";
}
B bclass;
};
在main函数中使用类似:
int main() {
A a;
a.bclass->PrintB();
system("PAUSE");
}
答案 0 :(得分:3)
你需要问自己的问题
编译器如何计算A
嗯 - 需要弄清楚B
但B
中有A
。
你可以永远绕过那个循环
所以你不能这样做。
所以使用指针和转发声明
答案 1 :(得分:0)
通常,函数定义放在cpp
文件和h
或hpp
文件中的类定义中。
在cpp
个文件中,您同时包含两个类hpp
。
cpp中定义的每个函数都可以看到这两个类的定义,并且可以创建新的类。
但是在声明中你只能使用指针或对该类对象的引用。
== a.hpp ==
#pragma once
class B;
class A {
public:
void PrintA();
B* b;
};
== b.hpp ==
#pragma once
#include "a.hpp"
class B : public A {
public:
void PrintB();
A* a;
};
== a.cpp ==
#include "a.hpp"
#include "b.hpp"
void A::PrintA() {
b = new B();
std::cout << "A";
}
== b.cpp ==
#include "a.hpp"
#include "b.hpp"
void B::PrintB() {
a = new A();
std::cout << "A";
}
主要:
int main() {
A a;
a.PrintA();
a.b->PrintB();
B b;
b.PrintA();
b.PrintB();
system("PAUSE");
}
this link所有工作示例都在一个文件中。
one else link似乎使用了Visual Studio编译器。
答案 2 :(得分:-1)
仅为示例,您可以使用指针指向A实例(如下所示)中的B实例:
class A {
public:
void PrintA() {
std::cout << "A";
}
std::unique_ptr<B> bclass;
};
A a;
A.bclass=new B;
A.bclass->PrintB();
唯一指针将管理内存释放。