在另一个类中声明一个类[重复]

Posted

技术标签:

【中文标题】在另一个类中声明一个类[重复]【英文标题】:declaration of a class inside another class [duplicate] 【发布时间】:2016-02-15 19:51:56 【问题描述】:

我的程序有问题...我有一个 A 类,以及从 A 类继承的 B 类和 C 类...它们位于另一个名为 Game 的类中,如下所示:

class Game 
    public:
        Game(bool something);
       //all the other functions
    private:
      A a;

我这样做是因为我事先不知道对象是 B 类还是 C 类,所以我将它声明为 A 然后:

Game(bool something) 
    if (something)  a = B(); 
    else (something)  a = C(); 

现在我的问题: 在程序中,我问天气“a”是 B 还是 C……如果它是 B,我想要运行一个函数,而不是只有 B 有,A 和 C 都没有。但是,当然,编译器不让我这样做,因为它认为 a 是 A 类对象。有人知道如何解决这个问题吗?

【问题讨论】:

你需要 pointers 否则你会得到object slicing 另外,如果A没有共同点,那么有两个指针,根据哪个指针不为空来决定做什么。 @crashmstr 或引用。简而言之:间接。 根据变量使用强制转换。 if(something) ((B)a).methodB() else ((C)a).methodC()。例如。 “因为它认为 a 是 A 类对象” - a 一个 A 类对象。 【参考方案1】:
class Game 
    public:
        Game(bool something) : a() ;
        ~Game() if(a) delete a; ;
        // this is only example, and really need to implement 3 or 5 method
        // or use std::shared_ptr instead of pointer, more details at
        // https://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29
    private:
      A* a;


Game(bool something) 
    if (something)  a = new B(); 
    else            a = new C(); 


B* b= dynamic_cast<B*>(a);
if( b ) b->method_b_only();
C* b= dynamic_cast<C*>(a);
if( c ) c->method_c_only();

手动定义类型的可能的特殊对象名称或 id:

class B : public A 
  public:
    B() : _name("B") 
    const std::string& name()  return _name; 
  private:
    std:string _name;


B* b = a;
if( "B" == b.name() ) b->method_b_only();
C* C = a;
if( "C" == c.name() ) c->method_c_only();

【讨论】:

应该是dynamic_cast&lt;Type*&gt;(a)。此外,您不能两次定义相同的构造函数。 是的,谢谢 太棒了!!!非常感谢!这完全解决了我的问题!你太棒了! ^^ 在执行此操作之前请仔细考虑。考虑改为在A 中定义一个纯虚拟virtual void doSubclassSpecificBehaviour() = 0; 并让Game 调用此函数。 BC 都用自己的行为实现了这个功能。此方法必须由子类实现,并消除一整套逻辑问题的可能性,因为它们将被编译器捕获。 @oklas 我建议编辑此答案以使用std::unique_ptr&lt;A&gt; a;,因为unique_ptr 使您可以使用该类进行的其他所有操作都变得更加容易。例如,your current answer violates the Rule of Three.【参考方案2】:

实现所需功能的最直接方法是使用指针。即。

class Game 
    public:
        Game(bool something);
    private:
        A *a;

然后您可以使用new 关键字创建对象。

这允许您拥有您正在寻找的多态结构。还有其他涉及复制构造函数和引用的方法,但不是那么简单易用。

【讨论】:

以上是关于在另一个类中声明一个类[重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有在另一个类中声明的 pushViewController 的 UIButton

在另一个类中声明具有成员初始化器的类的实例

我有2个服务类,它们都使用自动装配的bean扩展相同的父类,我可以在一个类中使用bean但在另一个类中不使用[重复]

C ++:如何访问另一个类中的类函数?

如何在另一个类中填充来自foreach的Combobox

一个方法中的hashMap的值,怎么在另一个类中调用啊?