C++ 在另一个类中声明一个类
我的程序有问题。。。我有一个a类,B类和C类继承自a类。。。他们住在另一个叫做游戏的班级里,就像这样: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
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();