gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:50:03 24 4
gpt4 key购买 nike

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

假设您在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com