在另一个类中声明一个类

时间:2016-02-15 19:51:56

标签: c++

我的程序有问题...我有一个A类,B类和C类继承自A类...它们住在另一个名为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类对象。有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

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();

答案 1 :(得分:0)

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

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

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

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