0

这是我在 stackoverflow 上的第一篇文章,所以要温柔:)

我有标准的钻石问题,但我设法解决了。

class Control  
{ 
  public:  
    bool Focused;  
};

class Caption : public virtual Control  
{
  public:  
    string Text;  
};

class Frame : public virtual Control { };

class Textbox : public Caption, public Frame, public TextEditor { };

可悲的是,出现了另一个继承问题。类TextEditor具有通用变量名:

class TextEditor
{
  public:
    bool Focused;  
    string Text;  
};

编译器给了我错误:

“文本”的模糊访问

'Focused'的模棱两可的访问

但我想要的只是将所有类中的那些变量合并到派生类“文本框”中。

这是有问题的UML图片的链接

感谢您提供任何形式的帮助,对于我提出的任何语言错误和/或问题,我们深表歉意。

更新

一点解释,因为我可能用错了词。对此感到抱歉。

通过“合并”,我的意思是:

  • 如果我使用 的变量或方法ControlCaption否则Frame会影响 的值,TextEditor反之亦然。换句话说,变量在派生类中共享。

所以我的最后一堂课看起来像这样:

class Textbox : public Caption, public Frame, public TextEditor  
{  
  public:   
    string Text;  
    bool Focused;  
};

而不是这样:

class Textbox : public Caption, public Frame, public TextEditor  
{  
  public:   
    string Caption::Text;   
    bool Caption::Focused;  
    string TextEditor::Text;  
    bool TextEditor::Focused;  
};

现在正在发生的事情。因为我不能这样做:

Textbox A;
A.Text = "Text";

因为我有两个名为Text. 所以我必须这样做:

Textbox A;
A.Caption::Text = "Text";
A.TextEditor::Text = "Text";

最好的问候拉维

4

1 回答 1

0

笔记:

  1. 考虑使用mutator 方法
  2. http://sscce.org/ - 你的例子似乎有点过头了 - 如果你在问题中的例子实际上是 sscce,那么给你一个如何解决你的问题的清晰例子会更容易。无论哪种方式,它仍然足够,我猜你的问题很清楚。

答案:

  1. 为什么不class TextEditor也继承自class Controland class Caption?这似乎是一个显而易见的解决方案——class TextBox 尽管如此,您仍然必须使用虚拟继承。
  2. 如果 1 不是一个选项 - 那么有这个 - 但在这个有限的示例中,HasText 和 Focusable 分别与 Caption 和 Control 相比似乎毫无意义。

    class HasText
    {   
    public:
        virtual string& text() { return text; }
        virtual const string& text() const { return text; }
    private:
        text
    };  
    
    class Focusable
    {   
    public:
        virtual bool& focused() { return focused; }
        virtual const bool& focussed() const { return focussed; }
    };  
    
    class Control : public virtual Focusable { };
    
    class Caption : public virtual Control, public virtual HasText { };
    
    class Frame : public virtual Control { };
    
    class TextEditor : public virtual HasText, public virtual Focusable { };
    
    class Textbox : public virtual Caption, public virtual Frame, public virtual TextEditor { };
    
于 2013-07-15T20:41:10.277 回答