c++ - 我需要以一种可以从循环中调用构造函数的方式来组织我的类

标签 c++ class polymorphism

这很难解释,所以让我举个例子:

假设您在 GUI 上有 10 个项目,它们都是从同一个抽象基类继承的成员。您希望能够使用循环来检查用户是否单击了任何项目。然后您希望能够从该项目调用构造函数。其本质是指针指向对象,但我想问的是是否有可能让它们指向实际的类或使用类似的功能做一些事情。鉴于此解释似乎有点令人困惑,请允许我使用代码进行详细说明。

为简单起见,此示例将使用 3 个项目而不是 10 个

class A //the base class
{
public:
    int x,y;// inherited values
    virtual void render() = 0;// thats right its an abstract class
};
A * basePointer = NULL;


class a0: public A
{
public:
    a0()
    {
        //do stuff
    }
    void render()
    {
        //do render stuff
    }
}

class a1: public A
{
public:
    a1()
    {
        //do different stuff
    }
    void render()
    {
        //do different render stuff
    }
}

class a2: public A
{
public:
    a2()
    {
        //do even more stuff
    }
    void render()
    {
        //do even more render stuff
    }
}



mainloop()
{
    //handle events and get mouse position
    for(int i = 0;i < 3;i++)//3 being the number of non-absract classes
    {
        if(a[i].x = mousePos.x && a[i].y = mousePos.y)
        {
            basePointer = new a[i]
        }
    }
}

我知道尝试使用 a[i] 和循环来引用 a1、a2 和 a3 有点愚蠢,但我希望它能帮助您理解我正在尝试做的事情。感谢您提供任何帮助或解决建议。

最佳答案

实现此目的的典型方法称为“克隆”,或 Factory design pattern 的另一种形式。 .

您可以在 Base 类中添加一个 Clone 纯虚方法,允许每个对象克隆自身。

class A //the base class
{
public:
    int x,y;// inherited values
    virtual void render() = 0;// thats right its an abstract class
    virtual std::unique_ptr<A> Clone() = 0;
};

典型的覆盖非常简单:

//In class a1
virtual std::unique_ptr<A> Clone()
{
    auto clone = new a1();
    clone->x = x;
    clone->y = y;
    return std::unique_ptr<A>(clone);
}

然后编写一个 for 循环来渲染和复制对象是微不足道的:

std::vector<A*> items;
items.push_back(new a0 ());
items.push_back(new a1 ());
items.push_back(new a2 ());

for(auto item : items)
{
    item->render();
    auto new_item = item->Clone();
    // use the clone
}

ideone 上的实例.

关于c++ - 我需要以一种可以从循环中调用构造函数的方式来组织我的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24112122/

相关文章:

c++ - 使用 TinyXml 将 XML 写入 txt 文件

python - 安排训练和测试机器学习

c++ - C++ STL 容器中的多态性

c# - 列表框中的 WPF 数据模板多态性

c++ - 调用内联汇编的正确方法

c++ - 为什么 auto_ptr 似乎违反了 Visual C++ 上的私有(private)继承?

c++ - 使用预处理指令检查是否包含 header ?

swift - 快速访问另一个类的变量

python - 如何按继承深度对 Python 类列表进行排序?

c# - C# 中的显式方法表而不是 OO - 好吗?坏的?