C++;::如何将不同长度的常量字符串数组放入公共类中 对不起,新的C++,从C转换,并努力找到一个好的方法来做这个……

C++;::如何将不同长度的常量字符串数组放入公共类中 对不起,新的C++,从C转换,并努力找到一个好的方法来做这个……,c++,C++,//片段如下 const char *List1[]={"Choice1", "Not a good choice", "choice3"}; //rom-able const char *List2[]={"Hello", "Experts", "Can", "You", "Help?"}; class ListIF{ private: int index; char *list; public: void GetValString(char *tgt,int len);//get

//片段如下

const char *List1[]={"Choice1", "Not a good choice", "choice3"}; //rom-able
const char *List2[]={"Hello", "Experts", "Can", "You", "Help?"};

class ListIF{
private:
 int index;
 char *list;
public:
  void GetValString(char *tgt,int len);//get parameter value as string max len chars
  void SetIndex(int n){index = n;};
  int  GetIndex(void){return index;};
};
//末端片段

问题是如何编写构造函数,这样我就可以在类中“封装”列表,而不会得到堆膨胀(嵌入式目标)。然后是如何编写gettor,以便我们可以看到类中的list[index]


<>我试图做一些看起来很明显的事情,所以我在C++中缺少了什么东西?

< p>,更喜欢使用<代码> STD::String > <代码> const char */COD>。它将解决您使用
const char*
遇到的大多数问题

对于字符串数组,请使用
std::vector
。它将解决您在使用
const char*[]
时遇到的大多数问题

您甚至可以使用多个字符串初始化
std::vector
,如下所示:

std::vector<std::string> List1(adder<std::string>("Choice1")("Not a good choice")("choice3"));
std::vector<std::string> List2(adder<std::string>("Hello")("Experts")("Can")("You")("Help?"));
向量列表1(加法器(“选择1”)(“不是一个好的选择”)(“选择3”); std::矢量列表2(加法器(“你好”)(“专家”)(“你”)(“帮助”); 其中,
adder
是一个类模板,定义如下:

template<typename T>
struct adder
{
   std::vector<T> items;
   adder(const T &item) { items.push_back(item); }
   adder& operator()(const T & item) { items.push_back(item); return *this; }
   operator std::vector<T>&() { return items ; }
};
模板
结构加法器
{
向量项;
加法器(常量T&item){items.push_back(item);}
加法器和运算符()(const T&item){items.push_back(item);返回*this;}
运算符std::vector&({返回项;}
};

这里的运行代码:C++中的

< P>,更喜欢使用<代码> STD::String > > const char */COD>。它将解决您使用
const char*
遇到的大多数问题

对于字符串数组,请使用
std::vector
。它将解决您在使用
const char*[]
时遇到的大多数问题

您甚至可以使用多个字符串初始化
std::vector
,如下所示:

std::vector<std::string> List1(adder<std::string>("Choice1")("Not a good choice")("choice3"));
std::vector<std::string> List2(adder<std::string>("Hello")("Experts")("Can")("You")("Help?"));
向量列表1(加法器(“选择1”)(“不是一个好的选择”)(“选择3”); std::矢量列表2(加法器(“你好”)(“专家”)(“你”)(“帮助”); 其中,
adder
是一个类模板,定义如下:

template<typename T>
struct adder
{
   std::vector<T> items;
   adder(const T &item) { items.push_back(item); }
   adder& operator()(const T & item) { items.push_back(item); return *this; }
   operator std::vector<T>&() { return items ; }
};
模板
结构加法器
{
向量项;
加法器(常量T&item){items.push_back(item);}
加法器和运算符()(const T&item){items.push_back(item);返回*this;}
运算符std::vector&({返回项;}
};

此处的示例运行代码:

不确定您希望函数是什么,但包装数组的一种方法是:

编辑:更改为合并拉斯曼的建议(可能您的编译器无法处理他的答案)

类列表
{
私人:
std::vector m_list;//将PTR存储到ROM
公众:
ListIF(char const**list,size\t n):m\u list(list,list+n){}
常量字符*获取(整数位置)
{
返回m_列表[pos];
}
};

不确定您希望函数是什么,但包装数组的一种方法是:

编辑:更改为合并拉斯曼的建议(可能您的编译器无法处理他的答案)

类列表
{
私人:
std::vector m_list;//将PTR存储到ROM
公众:
ListIF(char const**list,size\t n):m\u list(list,list+n){}
常量字符*获取(整数位置)
{
返回m_列表[pos];
}
};
您可以将任何想要的方法添加到此类中

(我选择了名称
static\u array
,因为就类而言,底层数组必须是静态的:它不应该因为
realloc
或其他原因而增长、收缩或移动。这并不意味着数组必须具有静态链接。)

您可以将任何想要的方法添加到此类中



(我选择了名称
static\u array
,因为就类而言,底层数组必须是静态的:它不应该因为
realloc
或其他原因而增长、收缩或移动。这并不意味着数组必须具有静态链接。)

OP希望在ROM内存中使用文本
std::string
将在RAM中创建一个副本。@larsmans:但是可以使用自定义分配器来处理它。可以这样做……保持简单。最终产品具有unicode处理的GUI,因此数据类型无论如何都需要更改。Ta.@Nick:如果你想要unicode,那么你可以使用
std::wstring
而不是
std::string
。OP想要在ROM内存中使用文字
std::string
将在RAM中创建一个副本。@larsmans:但是可以使用自定义分配器来处理它。可以这样做……保持简单。最终产品具有unicode处理的GUI,因此数据类型无论如何都需要更改。Ta.@Nick:如果你想要unicode,那么你可以使用
std::wstring
而不是
std::string
。听起来你想让列表成为类的静态成员,这样它们就可以在类的所有实例中共享。所以我不完全理解你的问题。你能描述一下你真正想要达到的目标吗?
ListIF
应该用于什么?如何使用
GetValString
?你能举个例子吗?基本思想是动态菜单结构。ListIF MyMenu[4]={Item1,Item2,Item3,Item4};对于(i=0;我想让列表成为类的静态成员,这样它们就可以在类的所有实例中共享。所以我不完全理解您的问题。您能描述一下您实际想要实现的目标吗?
ListIF
应该用于什么?如何使用
GetValString
吗?您能给出一个答案吗一个例子?基本思想是动态菜单结构。ListIF MyMenu[4]={Item1,Item2,Item3,Item4};for(i=0;iOr:
ListIF(char const**list,size\t n):m\u list(list,list+n){}
现在它不工作了,因为构造函数的名称与类名不匹配。很好。将使用:)或:
ListIF(char const**list,size\t n):m\u list(list,list+n){}
现在它将不起作用,因为ctor名称与类名不匹配。Nice.有意义。将使用。:)是否应该有setter函数?列表是常量(和ROM),但setter(runni
array1[1] = "foo!";