C++ 在另一个类中声明一个类

C++ 在另一个类中声明一个类,c++,C++,我的程序有问题。。。我有一个a类,B类和C类继承自a类。。。他们住在另一个叫做游戏的班级里,就像这样: class Game { public: Game(bool something); //all the other functions private: A a; } 我这样做是因为我事先不知道对象是B类还是C类,所以我将其声明为a类,然后: Game(bool something) { if (something) { a

我的程序有问题。。。我有一个a类,B类和C类继承自a类。。。他们住在另一个叫做游戏的班级里,就像这样:

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对象。有人知道如何解决这个问题吗?

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

class Game {
    public:
        Game(bool something);
    private:
        A *a;
}
然后可以使用
new
关键字创建对象


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

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

class Game {
    public:
        Game(bool something);
    private:
        A *a;
}
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();
然后可以使用
new
关键字创建对象



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

你需要指针,否则你也会得到,如果
A
中没有共同点,那么就有两个指针,并根据哪个指针不为空来决定做什么。@crashmstr或references。简而言之:间接。使用基于变量的转换。如果(某物)((B)a.methodB()其他((C)a.methodC())。例如,“因为它认为a是一个a类对象”-a是一个a类对象。你需要指针,否则你也需要指针,如果
a
中没有共同点,那么就有两个指针,并根据哪个指针不为空来决定做什么。@crashmstr或references。简而言之:间接。使用基于变量的转换。如果(某物)((B)a.methodB()其他((C)a.methodC())。例如,“因为它认为a是a类对象”-a是a类对象。它应该是
dynamic\u cast(a)
。另外,您不能两次定义同一个构造函数。当然,谢谢!!!谢谢!这完全解决了我的问题!你太棒了^^做这件事之前要仔细考虑。考虑一下,定义一个纯虚拟<代码>虚拟空隙DubCub具体行为(=)0;<在
A
中使用code>并让游戏调用此函数<代码>B和
C
都以自己的行为实现此功能。此方法必须由子类实现,并消除了一系列逻辑问题的可能性,因为编译器将捕获这些问题。@oklas我建议编辑此答案以供使用,因为
unique\u ptr
使您可以使用此类执行的所有其他操作变得更加简单。例如,它应该是
dynamic\u cast(a)
。另外,您不能两次定义同一个构造函数。当然,谢谢!!!谢谢!这完全解决了我的问题!你太棒了^^做这件事之前要仔细考虑。考虑一下,定义一个纯虚拟<代码>虚拟空隙DubCub具体行为(=)0;<在
A
中使用code>并让游戏调用此函数<代码>B和
C
都以自己的行为实现此功能。此方法必须由子类实现,并消除了一系列逻辑问题的可能性,因为编译器将捕获这些问题。@oklas我建议编辑此答案以供使用,因为
unique\u ptr
使您可以使用此类执行的所有其他操作变得更加简单。例如
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();