在另一个类中声明一个类[重复]
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<Type*>(a)
。此外,您不能两次定义相同的构造函数。
是的,谢谢
太棒了!!!非常感谢!这完全解决了我的问题!你太棒了! ^^
在执行此操作之前请仔细考虑。考虑改为在A
中定义一个纯虚拟virtual void doSubclassSpecificBehaviour() = 0;
并让Game 调用此函数。 B
和 C
都用自己的行为实现了这个功能。此方法必须由子类实现,并消除一整套逻辑问题的可能性,因为它们将被编译器捕获。
@oklas 我建议编辑此答案以使用std::unique_ptr<A> a;
,因为unique_ptr
使您可以使用该类进行的其他所有操作都变得更加容易。例如,your current answer violates the Rule of Three.【参考方案2】:
实现所需功能的最直接方法是使用指针。即。
class Game
public:
Game(bool something);
private:
A *a;
然后您可以使用new
关键字创建对象。
这允许您拥有您正在寻找的多态结构。还有其他涉及复制构造函数和引用的方法,但不是那么简单易用。
【讨论】:
以上是关于在另一个类中声明一个类[重复]的主要内容,如果未能解决你的问题,请参考以下文章
带有在另一个类中声明的 pushViewController 的 UIButton