假设我在实现native函数存根的 JNI 函数中有此代码:
JNIEnv* env; /*This is set to a valid JNIEnv* for this thread*/
jclass clz = env->FindClass("foo"); /*this has worked*/
Run Code Online (Sandbox Code Playgroud)
我需要打电话吗
env->DeleteLocalRef(clz);
Run Code Online (Sandbox Code Playgroud)
一旦我完成了它?我不会回到clzJava,所以我想我需要删除本地引用?这似乎有点奇怪,因为像 a 一样MethodID, ajclass不包含对象实例。
我见过这样的代码:
std::sort(x, x + N,
// Lambda expression begins
[](float a, float b) {
return std::abs(a) < std::abs(b);
});
Run Code Online (Sandbox Code Playgroud)
显然,第三个参数std::sort是一个可以保存lambda的类型.但这是什么类型的?std::sort是如此严重超载我无法破译它.
(我正在考虑建立一个函数列表:我正在考虑使用lambdas而不是函数指针,因为后者必须具有大致相同的参数列表).
我想我可以写
auto letTheComplerSortOutTheType =
[](float a, float b) {
return std::abs(a) < std::abs(b);
});
Run Code Online (Sandbox Code Playgroud)
但在使用容器时,这对我没有帮助.
考虑以下代码:
try {
....
} catch (MyException e){
/*Can e be null here?*/
}
Run Code Online (Sandbox Code Playgroud)
鉴于null在Java中是一个类型化的空引用,是否有可能将上面的catch块输入e为null?
我正在为一个if函数实现一个生产规则:
qi::rule<Iterator, ascii::space_type, double(void)> f_if;
f_if = qi::ascii::string("if")
>> qi::char_('(')
>> (comparator >> ',' >> expression >> ',' >> expression) [qi::_val = boost::phoenix::bind(&Grammar<Iterator>::function_if, this, qi::_1, qi::_2, qi::_3)]
>> qi::char_(')')
;
Run Code Online (Sandbox Code Playgroud)
表达式和比较器声明为
qi::rule<Iterator, ascii::space_type, double(void)> expression;
qi::rule<Iterator, ascii::space_type, bool(void)> comparator;
Run Code Online (Sandbox Code Playgroud)
并且绑定函数具有原型
double function_if(bool comparator, double left, double right);
Run Code Online (Sandbox Code Playgroud)
我可以做些什么,以便根据比较器的值仅评估一个表达式吗?
我有一个Double[] foo,我需要转换数组中的每个元素:
我试过了
for (Double p : foo){
p = p * m + o;
}
Run Code Online (Sandbox Code Playgroud)
在哪里m和o是缩放因子.我也试过了
for (Double p : foo){
p *= m;
p += o;
}
Run Code Online (Sandbox Code Playgroud)
但这些都不起作用.我究竟做错了什么?我认为所有非原语都是Java中的引用.
我有一个类foo只是一个static函数和变量的占位符.有点像namespaceC++中的.
因此,创建foo和继承的实例foo是没有意义的.
所以我很想写public abstract final class foo.但Java不喜欢这样.我可以使用纯虚函数在C++中完成它final,但为什么我不能在Java中使用它?我的设计出了什么问题?
更新: 我在这方面得到了大量的投票(撰写本文时为-4),所以我显然还不够清楚.这是具体的用例.这是在JNI和支持C库中使用的错误日志记录的严重级别代码的加载:
public abstract class Severity
{
public static final int TRACE = 0x00000001;
public static final int INFORMATION = 0x00000002;
public static final int WARNING = 0x00000003;
public static final int ERROR = 0x00000004;
public static final int CRITICAL_ERROR = 0x00000005;
public static final int OFF = 0x00000006;
}
Run Code Online (Sandbox Code Playgroud)
所以它几乎就像一个枚举器,但JNI和C库限制意味着它不是最理想的.使这个abstract 和 final似乎完全合理的我,正如我已经说过了,相当于在C++允许.
考虑
public String toString()
{
return foo + bar;
}
Run Code Online (Sandbox Code Playgroud)
哪个foo和bar都是该类的字段.
如果foo且bar是或者都是null,那么JLS是否保证(null)为每个字段返回字符串,还是保留了抛出NPE的权利?
考虑
Foo* f = new Foo();
delete f;
Foo* g = f;
Run Code Online (Sandbox Code Playgroud)
由于我读到了一个我不拥有的内存指针,最终语句现在是不确定的吗?对我而言,它违反了一个过去的结束规则,所以它应该是.
注意
Foo* f;
Foo* g = f;
Run Code Online (Sandbox Code Playgroud)
未定义.
假设我有一堂课
struct Foo {double x; double y;}
Run Code Online (Sandbox Code Playgroud)
和std::vector<Foo> xy;
我还有一个函数可以提取x成员:
std::vector<double> bar(const std::vector<Foo>& xy);
Run Code Online (Sandbox Code Playgroud)
它循环遍历 的每个元素xy。
有没有办法使用 C++ 标准库来避免显式for循环?