C++ 如何为特定数量的字符串分配内存?

C++ 如何为特定数量的字符串分配内存?,c++,memory,constructor,allocation,C++,Memory,Constructor,Allocation,我的任务是编写类似于词典的程序,而我为意义分配内存的方式就是在构造函数中分配100个意义,这非常好 然而,教授不同意,他让我重写代码,让我为相关数量的含义分配内存。我基本上不知道如何做到这一点,构造函数如何提前知道我将具有多少含义 你们有什么建议?我只发布了与问题相关的部分代码 #include"expression.h" //---------------------METHODS------------------------------------------- Expression:

我的任务是编写类似于词典的程序,而我为意义分配内存的方式就是在构造函数中分配100个意义,这非常好

然而,教授不同意,他让我重写代码,让我为相关数量的含义分配内存。我基本上不知道如何做到这一点,构造函数如何提前知道我将具有多少含义

你们有什么建议?我只发布了与问题相关的部分代码

#include"expression.h"

//---------------------METHODS-------------------------------------------

Expression::Expression(int m_ctr)
{
    count_meanings = m_ctr; // Set the counter to 0
    meanings = new char * [100]; // Allocate memory for 100 meanings
}

Expression::~Expression()
{
    delete [] meanings; // Free the allocated memory
    delete [] word_with_several_meanings; // Free the allocated memory
}

void Expression::word(char *p2c)
{
    word_with_several_meanings = new char[strlen(p2c)+1];
    strcpy(word_with_several_meanings, p2c); // copy the string, method: DEEP copy
}

void Expression::add_meaning(char *p2c)
{
    meanings[count_meanings] = new char[strlen(p2c)+1];
    strcpy(meanings[count_meanings++], p2c); // copy the string, method: DEEP copy
}

char * Expression::get_word()
{
    return word_with_several_meanings;
}

char * Expression::get_meaning(int n_meaning)
{
    return * (meanings + n_meaning);
}

int Expression::get_total_number_of_meanings()
{
    return count_meanings;
}

int main(void)
{
    Expression expr;

    expr.word("bank");
    expr.add_meaning("a place to get money from");
    expr.add_meaning("a place to sit");

    cout << expr.get_word() << endl;

    for(int i = 0; i<expr.get_total_number_of_meanings(); i++)
        cout << " " << expr.get_meaning(i) << endl;
#包括“expression.h”
//---------------------方法-------------------------------------------
表达式::表达式(int m_ctr)
{
count\u meansions=m\u ctr;//将计数器设置为0
含义=新字符*[100];//为100个含义分配内存
}
表达式::~Expression()
{
delete[]含义;//释放分配的内存
删除具有多个\u含义的[]单词\u;//释放分配的内存
}
void表达式::word(char*p2c)
{
具有多个意义的单词=新字符[strlen(p2c)+1];
strcpy(单词_具有_多个_含义,p2c);//复制字符串,方法:深度复制
}
void表达式::add_含义(char*p2c)
{
意义[计数意义]=新字符[strlen(p2c)+1];
strcpy(meanss[count_meanss++],p2c);//复制字符串,方法:深度复制
}
char*表达式::get_word()
{
返回具有多个\u含义的单词\u;
}
char*表达式::get_含义(int n_含义)
{
返回*(含义+n_含义);
}
int表达式::获取意义的总数()
{
返回计数单位;
}
内部主(空)
{
表达谱;
解释词(“银行”);
expr.add_的意思是(“一个赚钱的地方”);
expr.add_意思是(“坐的地方”);

coutC++的方法是使用:

  • std::string
    存储单个字符串(而不是原始字符*C类字符串)
  • std::vector
    存储字符串序列(如字典中的“含义”)
因此,您可以在类中有一个
vector
数据成员,并且可以使用
vector::push_back()
动态地向其添加含义(即
string
s)

如果出于某种原因希望保持原始C级别,可以使用数据结构,在每个节点内存储原始C字符串指针,当添加新的含义时,可以创建指向该字符串的新节点,并将该节点添加到链接列表中。具有类似于此的节点定义的单链接列表可能就足够了:

struct MeaningListNode 
{
    char * Meaning;                 // Meaning raw C string
    struct MeaningListNode* Next;   // Pointer to next meaning node, or nullptr for last
};

但是,坦率地说,
vector>
方法对我来说似乎更简单、更好。

实现这一点的C++方法是使用:

  • std::string
    存储单个字符串(而不是原始字符*C类字符串)
  • std::vector
    存储字符串序列(如字典中的“含义”)
因此,您可以在类中有一个
vector
数据成员,并且可以使用
vector::push_back()
动态地向其添加含义(即
string
s)

如果出于某种原因希望保持原始C级别,可以使用数据结构,在每个节点内存储原始C字符串指针,当添加新的含义时,可以创建指向该字符串的新节点,并将该节点添加到链接列表中。具有类似于此的节点定义的单链接列表可能就足够了:

struct MeaningListNode 
{
    char * Meaning;                 // Meaning raw C string
    struct MeaningListNode* Next;   // Pointer to next meaning node, or nullptr for last
};

但是,坦率地说,
vector>
方法对我来说似乎更简单、更好。

实现这一点的C++方法是使用:

  • std::string
    存储单个字符串(而不是原始字符*C类字符串)
  • std::vector
    存储字符串序列(如字典中的“含义”)
因此,您可以在类中有一个
vector
数据成员,并且可以使用
vector::push_back()
动态地向其添加含义(即
string
s)

如果出于某种原因希望保持原始C级别,可以使用数据结构,在每个节点内存储原始C字符串指针,当添加新的含义时,可以创建指向该字符串的新节点,并将该节点添加到链接列表中。具有类似于此的节点定义的单链接列表可能就足够了:

struct MeaningListNode 
{
    char * Meaning;                 // Meaning raw C string
    struct MeaningListNode* Next;   // Pointer to next meaning node, or nullptr for last
};

但是,坦率地说,
vector>
方法对我来说似乎更简单、更好。

实现这一点的C++方法是使用:

  • std::string
    存储单个字符串(而不是原始字符*C类字符串)
  • std::vector
    存储字符串序列(如字典中的“含义”)
因此,您可以在类中有一个
vector
数据成员,并且可以使用
vector::push_back()
动态地向其添加含义(即
string
s)

如果出于某种原因希望保持原始C级别,可以使用数据结构,在每个节点内存储原始C字符串指针,当添加新的含义时,可以创建指向该字符串的新节点,并将该节点添加到链接列表中。具有类似于此的节点定义的单链接列表可能就足够了:

struct MeaningListNode 
{
    char * Meaning;                 // Meaning raw C string
    struct MeaningListNode* Next;   // Pointer to next meaning node, or nullptr for last
};

但是,坦率地说, vector > <代码>方法看起来更简单,对我也更好。

如果这是C++的赋值,为什么使用C字符串?meanings@willywonka_dailyblah参见“添加意义”对于那些分配,为什么你要使用C字符串,如果这是C++分配?那么,这实际上是一个P2P变量**meanings@willywonka_dailyblah参见“添加意义”对于那些分配,为什么你要使用C字符串,如果这是C++分配?那么,这实际上是一个P2P变量**meanings@willywonka_dailyblah请参阅“添加意义”,了解这些分配的位置为什么是y