也许 C++ 和 Java 的人可以帮助我定义我要解释的这个问题。我在 Ada 中有一个问题(你不需要知道它,我只是对这个概念感兴趣)关于如何表示实现动态标识符三个主要分支的类的构造函数:
我要调用这个类Par_Class,并将任何构造的对象调用Par_Obj。因此,当一个对象 Par_Obj 被创建时(因此,数字值被初始化,列表/堆栈分配了其他列表/堆栈或为空并且线程执行的内存范围被保留),操作系统自动开始与我的主应用程序并行执行新线程(现在它们争用系统资源)。但为了简化示例,假设我有一个类,其中包含一个整数和一个指向字符串的指针。
例如,我可以在 C++ 中编写代码(如果我做错了,请纠正我)
class Par_Class {
public:
Par_Class (int aValue, const std::string & aName);
private:
int theValue;
std::string theName;
};
构造函数可以实现为
Par_Class::Par_Class (int aValue, const std::string & aName)
: theValue(aValue)
, theName(aName)
{
}
最后我们可以实例化这个类
Par_Class Par_Obj (23, "My object is this");
并确保此构造方法属于类 Par_Class 而不是任何其他类。
同样,在 Java 中,我们可以编写代码
public class Par_Class {
private int theValue;
private String theName;
public Par_Class (int aValue, String aName){
theValue = aValue;
theName = aName;
}
};
我们可以使用实例化对象
Par_Class Par_Obj = new Par_Class (23, "My object is this");
(如果我错了,请再次纠正我)。同样,Par_Class 构造函数是类 Par_Class 的一个方法。
在 Ada 2005 中,此类可以编码为
--par_pkg.ads
package Par_Pkg is
type Par_Class is tagged private;
type Par_Class_Ptr is access all Par_Class;
type Integer_Ptr is access Integer;
function Construct
(P : access Par_Class; aValue : Integer; aName : Integer_Ptr)
return Par_Class_Ptr;
private
type Par_Class is tagged
record
theValue : Integer;
theName : Integer_Ptr;
end record;
end Par_Pkg;
-- par_pkg.adb
package body Par_Pkg is
function Construct
(P : access Par_Class; aValue : Integer; aName : Integer_Ptr)
return Par_Class_Ptr is
pragma Unreferenced (P);
P_Ptr : constant Par_Class_Ptr := new Par_Class;
begin
P_Ptr.theValue := aValue;
P_Ptr.theName := aName;
return P_Ptr;
end Construct;
end Par_Pkg;
并且用户可以调用
with Par_Pkg; use Par_Pkg;
procedure Par_Main is
Par_Obj : Par_Class_Ptr;
Int_Obj : Integer_Ptr;
begin
Int_Obj := new Integer;
Int_Obj.all := 12; -- don't worry about been string or integer
Par_Obj := Par_Obj.Construct
(aValue => 23,
aName => Int_Obj);
end Par_Main;
这就是问题所在。编译器告诉我,我不能在 Par_Obj := Par_Obj.Construct 中使用 Construct 方法,因为我的对象还是空的。但这很明显,因为我只想初始化对象(这样它就不会再为 null)。还有其他构造对象的方法,例如,使用类外部的函数,但我不想使用这种方法,因为它脱离了体系结构。你能帮我把这个问题表述给我的 Ada friend ,这样他们就可以帮助我在 Ada 中实现它吗?我想我在用一般概念术语解释这一点时有点困难。谢谢。
回答
@paercebal 给了我我认为可以实现我的目标的东西:
我可以用“有没有办法在标记类型中声明一个“静态”函数?另外,声明该类的包可以充当友元函数还是静态函数?”
更新
根据@SimonWright 和来自 comp.lang.ada 论坛的一些人的建议,得到了更多关于为什么实现它的充分理由:
function Construct (aValue: Integer; aName: Integer)
return Par_Class is
begin
return (theValue => aValue,
theName => aName);
end Construct;
所以我问:在这种情况下,函数 Construct 将表现为 C++ 静态函数(或者可能是 friend 函数?)?
Dmitry Kazakov 回答说:
That depends on what you mean. In Ada:
there is no hidden parameters
an operation can be dispatching (virtual) in any combination of parameters and/or result. But an operation cannot be dispatching in more than one type (no multiple dispatch). All tags of dispatching parameters must be same (no multi-methods).
there is no static or friend operations as the visibility rules are based on packages.
The function Construct above is a primitive operation, it is not a constructor.
Constructors in Ada are implicit, they consist of
construction of the components (in an unspecified order, recursively);
a call to Initialize if the type is a descendant of Ada.Finalization.[Limited_]Controlled. (Overridden bodies of Initialize are not called! I.e. Ada constructors do not traverse derivation path. In short, aggregation is safe, derivation is not;
starting all task components. (Note, tasks are not running when Initialize is called!)
Destructors act in the reverse order: tasks - Finalize - components.
我想它会回应。谢谢大家。
最佳答案
Par_Class (int aValue, const char *aName) 是非常特殊的 C++ 构造函数语法;使用时,编译器会生成一个新的空白内存区域(如果有 new,则调用 malloc(),否则在堆栈上),构造函数会填充它。
这不与
相同function Construct
(P : access Par_Class; aValue : Integer; aName : Integer_Ptr)
return Par_Class_Ptr;
这需要有一个先前的 Par_Class 实例,就像有一个 C++ 成员函数
Par_Class *a_Par_Class(int aValue, const char *aName);
如果使用未初始化的 Par_Class * 调用,它将以与当前 Ada 代码相同的方式失败。
我认为最接近(Ada 2012)的构造函数是
function Construct
(aValue : Integer; aName : Integer_Ptr)
return Par_Class is
begin
return Result : Par_Class do
Result.theValue := aValue;
Result.theName := aName;
end return;
end Construct;
或者,适用于 Ada 95/2005 并且最接近您目前的方案:
function Construct
(aValue : Integer; aName : Integer_Ptr)
return Par_Class_Ptr is
P_Ptr : constant Par_Class_Ptr := new Par_Class;
begin
P_Ptr.theValue := aValue;
P_Ptr.theName := aName;
return P_Ptr;
end Construct;
@paercebal 提到你需要一个静态成员函数,这是正确的; C++ 构造函数是我认为的语法糖。在 Ada 中,作用域是在包级别完成的,因此 function Construct - 在同一包的公共(public)部分声明并返回 Par_Class_Ptr - 明确无误地(在架构上)关联与 Par_Class。
关于java - 从 C++ 和 Java 到 Ada 的类构造概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8074623/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg