我试图使用std::string
而不是char*
尽可能使用,但我担心我可能会降低性能.这是返回字符串的好方法(为简洁起见,没有错误检查)吗?
std::string linux_settings_provider::get_home_folder() {
return std::string(getenv("HOME"));
}
Run Code Online (Sandbox Code Playgroud)
另外,一个相关的问题:当接受字符串作为参数时,我应该接收它们const std::string&
还是const char*
?
谢谢.
git status
显示了一堆被修改的文件和一些被删除的文件.我想首先提交修改后的文件,然后提交已删除的文件.我没有看到任何可以git add
让我这样做的选项.我该怎么做?
编辑:正如所指出的,git add
无论如何都不会上传已删除的文件,所以git add .
会这样做.但它有包含未跟踪的文件的副作用,我也想避免.我已相应更改了问题的标题.
我想避免不必要的副本.我的目标是:
std::ifstream testFile( "testfile", "rb" );
std::vector<char> fileContents;
int fileSize = getFileSize( testFile );
fileContents.reserve( fileSize );
testFile.read( &fileContents[0], fileSize );
Run Code Online (Sandbox Code Playgroud)
(这不起作用,因为reserve
实际上没有在向量中插入任何东西,所以我无法访问[0]
).
当然,std::vector<char> fileContents(fileSize)
有效,但是初始化所有元素的开销(fileSize
可能相当大).同样的resize()
.
这个问题与开销的重要程度无关.相反,我只是想知道是否有另一种方式.
按范围我的意思是一对迭代器.在伪C++中:
std::vector<int> v1 = { 1, 2, 3, 4, 5 };
std::vector<int> v2 = { 2, 3, 4 };
if( std::compare_range( v1.begin() + 1, v1.end() - 1, v2.begin(), v2.end() ) {
std::cout << "Alright\n";
}
Run Code Online (Sandbox Code Playgroud)
compare_range
当然是我正在寻找的功能.
免责声明:我知道,这是一个非常简单的写作功能.但像所有程序员一样,我试图变得懒惰;-)
我确信这是一个非常简单的问题.以下代码显示了我正在尝试执行的操作:
class MemberClass {
public:
MemberClass(int abc){ }
};
class MyClass {
public:
MemberClass m_class;
MyClass(int xyz) {
if(xyz == 42)
m_class = MemberClass(12);
else
m_class = MemberClass(32);
}
};
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为m_class
正在使用空构造函数(不存在)创建.这样做的正确方法是什么?我的猜测是使用指针和实例化m_class
使用new
,但我希望有一种更简单的方法.
编辑:我之前应该说过,但我的实际问题有一个额外的复杂性:我需要在初始化m_class之前调用一个方法,以便设置环境.所以:
class MyClass {
public:
MemberClass m_class;
MyClass(int xyz) {
do_something(); // this must happen before m_class is created
if(xyz == 42)
m_class = MemberClass(12);
else
m_class = MemberClass(32);
}
};
Run Code Online (Sandbox Code Playgroud)
是否有可能通过花哨的初始化列表技巧实现这一目标?
我正在开发一个动态加载JAR的应用程序,它包含它使用的一堆类的定义.一切都很顺利,直到我试图捕获动态加载的JAR中的Exception派生类.
下面的代码片段显示问题(DynamicJarLoader
是实际加载JAR类;既有TestClass
和MyException
在外部JAR):
public static void main(String[] args) {
DynamicJarLoader.loadFile("../DynamicTestJar.jar");
try {
String foo = new TestClass().testMethod("42");
} catch(MyException e) { }
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行它时,我得到了这个:
Exception in thread "main" java.lang.NoClassDefFoundError: dynamictestjar/MyException
Caused by: java.lang.ClassNotFoundException: dynamictestjar.MyException
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: dynamicjartestapp.Main. Program will exit.
Run Code Online (Sandbox Code Playgroud)
如果我更换catch(MyException e)
用catch(Exception e)
,程序运行正常.这意味着Java 是能够找到TestClass
的JAR已经加载之后.因此看起来JVM需要在程序开始运行时定义所有Exception类,而不是在需要它们时(即当达到特定的try-catch块时).
为什么会这样?
编辑
我已经进行了一些额外的测试,这确实很奇怪.这是完整的来源MyException
: …
签名的Java Applet与客户端上运行的普通Java应用程序具有相同的安全许可.对于特定项目,我需要这些权限,并且我需要在JavaScript调用的情况下执行特权操作.
现在,问题是,至少对于Ubuntu(目标浏览器和平台)中的Firefox 3,当通过未签名的JavaScript调用applet方法时,它会丢失其特殊权限.由于签名JavaScript不是一个选项,我需要一种方法来解决这个限制.
实现此目的的一种方法是在applet启动时创建一个线程,并在主线程接收到JavaScript调用时调用该线程上的方法.我已经实现了这个想法的工作原型,但我发现它有点笨拙,因为它使用了太多的反射并且不像我想要的那样容易重复使用.
做我正在做的事情有一种共同的,标准的方式吗?而且,如果我的想法是正确的方法,你将如何以可重用的方式实现它?我想要实现的是一个框架,它允许这个"运行方法在特权线程"的东西被用于各种对象.理想的,utopic解决方案将是这样的:
// when the applet starts-up
PrivilegedExecuter priv = new PrivilegedExecuter(myObject); //or MyClass.class
// ...
// inside a JavaScript-called method (myObject has myMethod)
priv.myMethod(); // myMethod is run synchronously in a privileged thread
Run Code Online (Sandbox Code Playgroud) 我MyClass::myMethod()
在另一个DLL上有一个静态方法MyDll.dll
.在我的代码中,我调用此方法,它编译并运行正常.
但是当我MyClass::myMethod()
在即时窗口(或观察窗口)中尝试时,我总是得到:
MyClass::myMethod()
CXX0052: Error: member function not present
Run Code Online (Sandbox Code Playgroud)
这是为什么?
更新:我发现当我使用上下文运算符时,它可以工作:
{,,MyDLL}MyClass::myMethod()
Run Code Online (Sandbox Code Playgroud)
我不确定为什么需要它,所以我要稍等一下,看看是否有人有一个很好的解释.
更新2:我被要求提供更多信息.不幸的是,我所描述的几乎就是我所拥有的一切.这是第三方代码.该方法驻留在不同的DLL上,声明如下:
class MyClass
{
public:
// ...
_declspec(dllimport) static const char *getDirectory(void);
}
Run Code Online (Sandbox Code Playgroud)
它被调用如下:
MyClass::getDirectory ()
Run Code Online (Sandbox Code Playgroud)
我没有消息来源.它是在VC++ 9下的Debug模式下编译的.
我的场景:一台服务器和一些客户端(虽然不多).服务器一次只能响应一个客户端,因此必须排队.我正在使用互斥(boost::interprocess::interprocess_mutex
)执行此操作,包含在boost::interprocess::scoped_lock
.
问题是,如果一个客户端在持有互斥锁时意外死亡(即没有析构函数运行),则其他客户端遇到麻烦,因为他们正在等待该互斥锁.我考虑过使用定时等待,所以如果我的客户端等待,比如20秒并且没有得到互斥锁,那么它就会继续与服务器通信.
这种方法的问题:1)它每次都这样做.如果它处于循环中,不断与服务器通信,则需要每次都等待超时.2)如果有三个客户端,并且其中一个客户端在持有互斥锁时死亡,则另外两个客户端将等待20秒并同时与服务器通信 - 这正是我试图避免的.
所以,我怎么能对客户说,"嘿那里,似乎这个互斥体已被抛弃,取得它的所有权"?
这在Safari中不起作用:
<html>
<body>
<applet id="MyApplet" code="MyAppletClass" archive="MyApplet.jar">
<script type="text/javascript">
alert(document.getElementById('MyApplet').myMethod);
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
myMethod
是一个声明的公共方法MyAppletClass
.
当我第一次在Safari中加载页面时,它会在applet加载完成之前显示警报(因此会显示消息框undefined
).如果我刷新页面,则已经加载了小程序并显示警报function myMethod() { [native code] }
,正如您所期望的那样.
当然,这意味着applet方法在加载之前不可用,但Safari并没有阻止JavaScript运行.同样的问题发生在<body onLoad>
.
我需要的是类似的东西<body onAppletLoad="doSomething()">
.我该如何解决这个问题?
谢谢
PS:我不确定它是否相关,但JAR已签署.
c++ ×6
java ×3
javascript ×2
stl ×2
applet ×1
boost ×1
class ×1
classloader ×1
concurrency ×1
debugging ×1
dom-events ×1
exception ×1
git ×1
iterator ×1
return-value ×1
safari ×1
security ×1
string ×1
vector ×1
visual-c++ ×1