将一个指向一个派生类的指针传递给另一个
Passing a pointer to one derived class to another
我仍在学习c++的基础知识,但我目前正在使用派生类和虚拟方法进行一个项目。因此,情况是:我有一个a级
class ClassA
{
public:
virtual void action();
};
有两个派生类B和C:
#include "ClassA.h"
class ClassB: public ClassA
{
public:
virtual void action();
int valueB;
};
-
#include "ClassA.h"
class ClassC: public ClassA
{
public:
virtual void action();
int valueC;
};
我想传递一个指向ClassB对象的指针,作为ClassC中action()的参数,这样我就可以做这样的事情:
void ClassC::action(ClassB * ptr)
{
cout << "The value is: " << ptr->valueB;
}
然而,我找不到一种工作方法。所有的对象指针都存储在中
vector<ClassA *> objects
其中
objects[0]=new ClassC();
objects[1]=new ClassB();
如果我尝试之类的东西
objects[0]->action(object[1])
那么我需要我在ClassA中的虚拟方法有一个参数ClassB*。然后,为了让程序识别我尝试过的类型,要么包括整个ClassB.h(坏主意,它创建了一个包含或其他内容的"循环"),要么使用前向声明类ClassB;(我收到一个关于无效使用不完整类型的错误)。所以我现在被卡住了。我希望一切都清楚,但如果需要的话,我当然可以提供更多的数据。
当您需要转发声明某个东西时,这是因为您不能包含类的整个定义。在这种情况下,如果正向声明ClassB
,编译器不知道其成员属性valueB
,这就是为什么会得到不完整的类型错误。为了解决这个问题,你必须对代码进行因子编码,比如:
//ClassA.h
class ClassB;
class ClassA
{
virtual void action(ClassB* ptr);
}
//ClassA.cpp
#include "ClassB.h"
void ClassA::action(ClassB* ptr) { ... }
因此,您基本上是使用标头来声明虚拟方法和前向声明ClassB
,但您在ClassA.cpp
中定义了它,以便在源文件中包含ClassB.h
,而不会出现问题,也不会有循环依赖的风险。
我注意到您的ClassC虚拟函数被声明为不带参数:
virtual void action();
但是您用一个参数定义派生类函数。
void ClassC::action(ClassB * ptr)
声明和定义必须匹配。将声明更改为:
virtual void action(ClassB *);
嗯。但是,您必须在ClassC声明之前包含ClassB。。。
#include "ClassB.h"
或转发声明ClassB。这是对编译器的承诺,可以在以后正确地声明和定义类。插入这一行的好地方是在ClassC声明之前。
class ClassB;
您可以将action
(在所有类中)定义为:
virtual void action(ClassA * ptr); // or ClassB *
然后,您可以传递ClassA的任何实例或从ClassA派生的实例。如果在头文件中提供Sentinel,则所有派生类都可以包括带有#include "ClassA.h"
的ClassA,因为它在c++:中很常见
#ifndef ClassAH
#define ClassAH
...
#endif
因此,标头将只包含一次。。。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如何在C++中将函数发送到另一个进程
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口