小编Ped*_*ino的帖子

我应该返回std :: strings吗?

我试图使用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*

谢谢.

c++ string return-value

65
推荐指数
6
解决办法
3万
查看次数

如何只提交修改过的(而不是新的或删除的)文件?

git status显示了一堆被修改的文件和一些被删除的文件.我想首先提交修改后的文件,然后提交已删除的文件.我没有看到任何可以git add让我这样做的选项.我该怎么做?

编辑:正如所指出的,git add无论如何都不会上传已删除的文件,所以git add .会这样做.但它有包含未跟踪的文件的副作用,我也想避免.我已相应更改了问题的标题.

git version-control

52
推荐指数
3
解决办法
8万
查看次数

将文件读入std :: vector <char>的有效方法?

我想避免不必要的副本.我的目标是:

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++ stl vector

36
推荐指数
2
解决办法
3万
查看次数

有没有一种标准的方法来比较C++中的两个范围?

按范围我的意思是一对迭代器.在伪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 当然是我正在寻找的功能.

免责声明:我知道,这是一个非常简单的写作功能.但像所有程序员一样,我试图变得懒惰;-)

c++ iterator stl

21
推荐指数
4
解决办法
4176
查看次数

有条件地初始化C++成员变量的正确方法?

我确信这是一个非常简单的问题.以下代码显示了我正在尝试执行的操作:

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)

是否有可能通过花哨的初始化列表技巧实现这一目标?

c++ class member-initialization

11
推荐指数
3
解决办法
9338
查看次数

在Java中,为什么在必要之前需要为类加载器提供Exception类?

我正在开发一个动态加载JAR的应用程序,它包含它使用的一堆类的定义.一切都很顺利,直到我试图捕获动态加载的JAR中的Exception派生类.

下面的代码片段显示问题(DynamicJarLoader是实际加载JAR类;既有TestClassMyException在外部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 exception noclassdeffounderror classloader

9
推荐指数
2
解决办法
1473
查看次数

当从unsigned Javascript调用时,如何获得已签名的Java Applet以执行特权操作?

签名的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)

javascript java security applet

7
推荐指数
1
解决办法
3069
查看次数

在VC++调试器上计算表达式时,为什么会出现"成员函数不存在"错误?

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模式下编译的.

c++ debugging visual-c++

7
推荐指数
1
解决办法
4301
查看次数

我如何获得废弃的boost :: interprocess :: interprocess_mutex的所有权?

我的场景:一台服务器和一些客户端(虽然不多).服务器一次只能响应一个客户端,因此必须排队.我正在使用互斥(boost::interprocess::interprocess_mutex)执行此操作,包含在boost::interprocess::scoped_lock.

问题是,如果一个客户端在持有互斥锁时意外死亡(即没有析构函数运行),则其他客户端遇到麻烦,因为他们正在等待该互斥锁.我考虑过使用定时等待,所以如果我的客户端等待,比如20秒并且没有得到互斥锁,那么它就会继续与服务器通信.

这种方法的问题:1)它每次都这样做.如果它处于循环中,不断与服务器通信,则需要每次都等待超时.2)如果有三个客户端,并且其中一个客户端在持有互斥锁时死亡,则另外两个客户端将等待20秒并同时与服务器通信 - 这正是我试图避免的.

所以,我怎么能对客户说,"嘿那里,似乎这个互斥体已被抛弃,取得它的所有权"?

c++ concurrency synchronization boost boost-interprocess

7
推荐指数
1
解决办法
2545
查看次数

如何等待Java applet在Safari上完成加载?

这在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已签署.

javascript java safari dom-events

6
推荐指数
1
解决办法
1万
查看次数