gpt4 book ai didi

c++ - 使用指针允许类充当创建另一个类实例的数据模板的缺点

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:47:22 26 4
gpt4 key购买 nike

我已经为这个问题纠结了一段时间,最终我想将数据与我想要创建的类分开,并将其转换为类中的指针。

例如,我想为我一直尝试去玩的 RPG 游戏创建一个元素类:

class ItemTemplate
{
public:
enum TYPE { //Item types here. };
//ctor's and methods here.
private:
std::string m_name;
int m_buyprice;
int m_sellprice;
TYPE m_type;
int m_maxUses;
}

基本上,ItemTemplate 用于定义对于该类型的任何 Item 对象的所有实例都是常量的任何数据,如下所示:

const ItemTemplate cPotionTemplate( "Potion" , HEALING , 300 , 50 , 3 );

说所有的药水都叫做“药水”,属于治疗元素类型,价格为 300G,售价为 50g,开始时有 3 次使用。这些数据都不会改变。将它设为 HealingItemTemplate 并说明它恢复了多少可能会更准确,但这离题了。

之后我想创建另一个类

class Item
{
public:
//ctors and methods here.
private:
ItemTemplate* m_Data;
int m_usesLeft;
}

基本上这只是访问 ItemTemplate 中的数据并跟踪该项目的使用次数。

我正在尝试的是减少程序运行时内存中存在的变量数量。

我知道我可以将所有这些数据捆绑到一个类中,但这意味着每个项目都将存储一份不会或不应更改的数据拷贝。

服用 sizeof(int)为 4,sizeof(type)为 4,sizeof(string)为 4 和 sizeof( a pointer )为 4。

我一直尝试实现它的方式为项目的每个实例使用 8 个字节,但执行捆绑方式将使用 24 + ( m_name.capacity() or m_name.size() * sizeof(char) )我知道后者不能准确说明保留空间,但我不确定前者。

无论如何,将所有数据捆绑在一个类中将使用至少 3 倍于分隔数据的字节数。我很难理解的是这种方法的缺点。我目前的想法是,这将增加函数调用和正在制作的数据拷贝。我在想,让 Item 类成为 ItemTemplate 类的 friend 将能够消除我认为很大一部分调用增加的情况,即访问器的调用。

基本上,我真的很难完全理解我一直想做出的权衡的缺点。

那么使用这样的实现有哪些可能的缺点?

有哪些方法可以帮助确定此类实现何时仍值得使用?如果这很重要,我正在使用 Code::Blocks 13.12 IDE,但在使用调试器方面我很不了解。

是否有另一种方法可以实现我所缺少的这种行为?我考虑过模板,但就将它们存储为 ItemTemplate 的每个派生而言,这似乎太死板了。类将创建一个新类型 Item<Derived Class>没有 Item<type>除非它们来自相同的推导,否则将能够存储在一起。这可能适用于某些系统,但不是理想的实现,因为它会使添加新的 Itemtypes 变得更加繁琐。

最佳答案

C++ 中的接口(interface)类将解决您对模板的担忧:

class ItemInterface
{
public:
enum TYPE { potion, scroll };
//ctor's and methods here.
public:
virtual std::string getName();
virtual int get_buyprice();
virtual int get_sellprice();
virtual TYPE get_type();
virtual int get_maxUses();
};


template<ItemInterface::TYPE T>
class item : ItemInterface {
private:
//Note, not all static members need to be constant
static const std::string m_name;
static const int m_buyprice;
static const int m_sellprice;
static const TYPE m_type;
static const int m_maxUses;

int m_usesLeft;

public:
item();
/*your getters implementation here*/
std::string getName(){return m_name;}
//etc...
};

//Your specialisations here.
//This looks ugly because it's private and const.
//Public static initialization would look better.

template<> const std::string item<ItemInterface::potion>::m_name = "potion";
//...
template<> const std::string item<ItemInterface::scroll>::m_name = "scroll";

关于c++ - 使用指针允许类充当创建另一个类实例的数据模板的缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35953206/

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