gpt4 book ai didi

c++ - 将指向一个派生类的指针传递给另一个派生类

转载 作者:行者123 更新时间:2023-11-30 02:34:29 24 4
gpt4 key购买 nike

我仍在学习 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,没有问题,也没有循环依赖的风险。

关于c++ - 将指向一个派生类的指针传递给另一个派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34534462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com