Ada 使用基本体操作创建对象

Ada 使用基本体操作创建对象,ada,Ada,我的问题包含一段较长的Ada代码。基本上,我尝试以面向对象的方式对带有标题的消息进行建模。两个基本操作Create\u Message和Create\u Message\u Access可用于创建具体的消息对象。我不确定原语操作是否应该返回类型Message\u type或Message\u type\u Access。推荐哪种类型(效率?),或者这两种解决方案都不是最优的 我认为第一种方法是在堆栈上创建对象,然后在执行return语句后复制对象,因为变量object超出范围。对还是错 函数创建

我的问题包含一段较长的Ada代码。基本上,我尝试以面向对象的方式对带有标题的消息进行建模。两个基本操作
Create\u Message
Create\u Message\u Access
可用于创建具体的消息对象。我不确定原语操作是否应该返回类型
Message\u type
Message\u type\u Access
。推荐哪种类型(效率?),或者这两种解决方案都不是最优的

我认为第一种方法是在堆栈上创建对象,然后在执行
return
语句后复制对象,因为变量
object
超出范围。对还是错

函数创建消息(标题:字符串)返回消息类型为
对象:消息类型;
开始
Object.Title:=To_无界_字符串(Title);
返回对象;
结束创建_消息;
我认为第二种方法是在堆上创建对象,然后在执行
return
语句后复制指针,因为变量
object
超出范围。对还是错

函数Create\u Message\u Access(标题:String)返回消息类型\u Access为
对象:消息类型访问:=新消息类型;
开始
Object.Title:=To_无界_字符串(Title);
返回对象;
结束创建消息访问;
后来,我创建了一个带有标题的示例对象,使用原语操作
Updated_title
更改标题,并在最后将其更改回原语

First_Message:=Message.Create_Message(“First”);
Ada.Text\u IO.Put\u行(第一条消息。获取标题);
第一条消息。更新标题(“第一次更改”);
Ada.Text\u IO.Put\u行(第一条消息。获取标题);
第一条消息。更新标题(“第一条”);
Ada.Text\u IO.Put\u行(第一条消息。获取标题);
输出为(如预期的):

然后我将消息保存在一个向量容器中,并尝试在遍历向量中存储的元素时更改标题。我发现标题保留了旧值,因此我假设调用操作
Message\u Vector.Element(Message\u Cursor)
只返回存储在向量中的消息的副本。对还是错

Messages.Append(第一条消息);
Message_Cursor:=Message_Vector.First(消息);
而Message_Vector.Has_元素(Message_Cursor)循环
声明
临时消息:Message.Message\u类型;
开始
临时消息:=消息向量元素(消息光标);
临时消息。更新标题(“首次更改”);
结束;
Message_Vector.Next(Message_光标);
端环;
Message_Cursor:=Message_Vector.First(消息);
而Message_Vector.Has_元素(Message_Cursor)循环
--
--打印“第一次”而不是“第一次更改”
--
Ada.Text\u IO.Put\u行(Message\u Vector.Element(Message\u Cursor).Get\u Title);
Message_Vector.Next(Message_光标);
端环;
最后一个问题:
Second\u Message.all.Get\u Title
Second\u Message.Get\u Title
之间有什么区别

Second_Message:=Message.Create_Message_Access(“Second”);
Ada.Text\u IO.Put\u行(第二条消息.all.Get\u标题);
Ada.Text\u IO.Put\u行(第二条消息。获取标题);
完整源代码:

使用Ada.Containers.Vectors;
使用Ada.Strings.Unbounded;使用Ada.Strings.Unbounded;
使用Ada.Text_IO;
主要程序是
包裹信息是
类型消息\u类型被标记为私有;
类型消息类型访问为访问消息类型;
函数Create_Message(标题:String)返回消息类型;
函数创建消息访问(标题:字符串)返回消息访问类型;
函数Get_Title(Self:Message_Type)返回字符串;
过程更新标题(Self:in-out消息类型;标题:字符串);
函数“=”(左、右:消息类型)返回布尔值;
私有的
类型消息\u类型被标记为记录
标题:无界_字符串;
结束记录;
结束消息;
包体消息是
函数Create_Message(标题:String)返回消息类型为
对象:消息类型;
开始
Object.Title:=To_无界_字符串(Title);
返回对象;
结束创建_消息;
函数Create_Message_Access(标题:String)返回消息类型_Access为
对象:消息类型访问:=新消息类型;
开始
Object.Title:=To_无界_字符串(Title);
返回对象;
结束创建消息访问;
函数Get_Title(Self:Message_Type)返回字符串为
开始
返回到_字符串(Self.Title);
最终获得头衔;
过程更新标题(Self:in-out消息类型;标题:String)为
开始
Self.Title:=To_无界_字符串(Title);
结束更新标题;
函数“=”(左、右:消息类型)返回布尔值为
开始
返回Left.Title=Right.Title;
结束“=”;
结束消息;
包消息向量是新的Ada.Containers.Vectors(索引类型=>Natural,
元素类型=>消息。消息类型,“=”=>消息。“=”;
包消息访问向量是新的Ada.Containers.Vectors(索引类型=>Natural,
元素类型=>Message.Message类型访问“=”=>Message.“=”;
消息:Message_Vector.Vector;
Message_Cursor:Message_Vector.Cursor;
消息访问:消息访问向量.Vector;
Message\u Access\u Cursor:Message\u Access\u Vector.Cursor;
第一条消息:Message.Message\u类型;
第二条消息:Message.Message\u类型\u访问;
开始
第一条消息:=Message.Create_消息(“第一条”);
Ada.Text\u IO.Put\u行(第一条消息。获取标题);
第一条消息。更新标题(“第一次更改”);
Ada.Text\u IO.Put\u行(第一条消息。获取标题);
第一条消息。更新标题(“第一条”);
Ada.Text\u IO.Put\u行(第一条消息。获取标题);
--
Ada.Text\u IO.New\u行;
Messages.Append(第一条消息);
Message_Cursor:=Message_Vector.First(Mess
First
First changed
First