Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++中,许多类派生自一个类,所有派生类使用从其他事物派生的类,但是它们的基使用Case的基_C++_C++11 - Fatal编程技术网

C++中,许多类派生自一个类,所有派生类使用从其他事物派生的类,但是它们的基使用Case的基

C++中,许多类派生自一个类,所有派生类使用从其他事物派生的类,但是它们的基使用Case的基,c++,c++11,C++,C++11,对不起,这个标题太难看了,很难解释 class BaseState { protected: BaseState(); public: void Some(); void Useful(); void Methods(); }; class UsefulState: public BaseState { public: void moreUsefulStuff(); }; class SomeUsefulBase { protected: So

对不起,这个标题太难看了,很难解释

class BaseState {
protected:
    BaseState();
public:
    void Some();
    void Useful();
    void Methods();
};

class UsefulState: public BaseState {
public:
    void moreUsefulStuff();
};

class SomeUsefulBase {
protected:
    SomeUsefulBase(BaseState* pState) { state = pState; }
    void UsefulMethods() { state->Some(); }
    void Andthings() { state->Useful(); }
public:
    virtual void doSomething() = 0;
protected:
    BaseState* state;
};

class SomethingUseful: public SomeUsefulBase {
public:
    SomethingUseful(UsefulState* pState): SomeUsefulBase(pState) {
        usefulState = pState;
    }
    virtual void doSomething() { usefulState->moreUsefulStuff();} 
protected:
    UsefulState* usefulState;
};
然后:

分配东西的位置并不重要,但是会有很多从某个useful派生的类会使用UsefulState。然而,SomeUsefulBase的所有成员函数都会使用state,而是作为BaseState

我希望有一种比在定义中使用两个成员有用的state和BaseState指针更好的方法,我想到了一个联合和一个模板,但那会很难看

我也不想在代码中乱丢类型转换,我想知道是否有更好的符号

每个操作将有一个UsefulState,一个大型树结构将由SomethingUseful的各种子类和/或SomethingUsefulBase的子类组成,其中预期有一个UsefulState指针

增编: 不知道SO的语法高亮是怎么回事!它似乎是在用case来决定它是否想把东西涂成蓝色。。。。我不知道这是怎么回事

增编2:
在使用中,此示例派生自每个操作有一个状态,但许多东西派生自某个有用的基础,派生类将相互创建以形成一个大型树结构god I sound noobish,但都需要使用派生状态。

这听起来像标准的抽象工厂类型情况:

struct AbstractGadget { virtual ~AbstractGadget() {} };
struct AbstractWidget { virtual ~AbstractWidget() {} };
struct AbstractThingy { virtual ~AbstractThingy() {} };

struct AbstractFactory
{
    virtual ~AbstractFactory() {}

    virtual std::unique_ptr<AbstractGadget> make_gadget() = 0;
    virtual std::unique_ptr<AbstractGadget> make_widget() = 0;
    virtual std::unique_ptr<AbstractGadget> make_thingy() = 0;
};
用法:

struct Gadget1 : AbstractGadget { /* ... */ };
struct Widget1 : AbstractWidget { /* ... */ };
struct Thingy1 : AbstractThingy { /* ... */ };

struct Factory1 : AbstractFactory
{
    virtual std::unique_ptr<AbstractGadget> make_gadget()
    {
        return { new Gadget1; }
    }

    // ...
};
等等,对于Factory2和Widget3等,这里也有大量的潜力可以用模板消除样板代码


消费者可能会得到一个AbstractFactory&f,并调用f.make_gadget等来创建合适类型的对象。

谢谢您的回答,请参阅第二个附录,以及您认为它为什么会被否决?讨厌的标题?@AlecTeal:可能有一个很大的类层次结构,这些类主要通过基类相互讨论。有对协变返回类型重写的支持,但不能使用不同的参数类型进行重写。可以定义逆变参数,但通常都是无用的。可能是因为演讲马虎、拼写不准确、总体结构和努力程度不够?谁是Syam,这也更好?我对发帖问题还不太熟悉,但我会努力的,我保证!由于某些原因@Ker和tab不起作用,此消息应以@KerrekSB@AlecTeal关于否决票,这不是我的,但我真的很难理解你的问题。这似乎是一个足够好的理由否决它。至于Kerrek为什么回答我,那是因为我在他的帖子中指出了一个微不足道的小错误,然后在他纠正后,我删除了我现在无用的评论。这经常发生在……上;哦,我明白了!很抱歉,这对我来说仍然是新鲜事,昨天我是40代表,我有一个很好的答案,它得到了很多选票,尽管我看起来自鸣得意299 GRR,我仍然是一个很好的noob!是301!现在重复。谢谢回复@Syam
struct Gadget1 : AbstractGadget { /* ... */ };
struct Widget1 : AbstractWidget { /* ... */ };
struct Thingy1 : AbstractThingy { /* ... */ };

struct Factory1 : AbstractFactory
{
    virtual std::unique_ptr<AbstractGadget> make_gadget()
    {
        return { new Gadget1; }
    }

    // ...
};