我正在从我的 Java 代码调用包含在同一文件夹中的 .class 的主类。该 main 是无效的,我想通过检查其退出状态来检查它是否成功:
...
String[] arguments = new String[]{"a", "b"};
AnotherClass.main(arguments);
...
Run Code Online (Sandbox Code Playgroud)
关于如何的任何想法,即 AnotherClass.main(arguments); 不返回任何东西?
谢谢你。
我找到了一些模板化的代码,在某些时候执行以下检查:
template<class IntegralType>
void randomFunction(IntegralType t)
{
...
if (t < 0)
...
}
Run Code Online (Sandbox Code Playgroud)
代码的概念t是整数类型(有符号或无符号).无论签名如何,代码都可以正常工作,但编译器会发出警告,因为在unsigned整数的情况下,检查将始终为true.
在C++ 03中有没有办法修改代码以摆脱警告而不抑制它?我正在考虑T以某种方式检查签名,不知道它是否可能.
我知道C++ 11,is_signed但我不确定它是如何在C++ 03中实现的.
我很好奇我在这段代码中发生的事情几乎是错误地写的:
#include <iostream>
class Test
{
public:
Test() {
std::cout << "Default constructor";
a= 10;
}
int a;
};
int main() {
Test obj(obj);
std::cout << obj.a << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它在gcc中编译而没有任何警告(使用-Wall -Werror).执行它只打印垃圾.
如果我没有弄错的话,这就是调用隐式的拷贝构造函数,而不是初始化.我很好奇复制构造函数在这种情况下会做什么,但gdb不会在该行中停止(设置为该行的断点跳转到下一行).
如果将"复杂"属性添加到类中(例如a std::string),一切都会中断,可能是因为'='运算符如何为这些类重载.
我的假设是否正确?为什么gdb不会停在该行?为什么在使用未初始化的对象调用复制构造函数时没有警告?
我想声明的是接受不同的STL容器的功能,但它们必须包含特定的类的对象(例如,它应该接受std::vector<double>和std::deque<double>,但没有std::vector<std::string>).
我已经找到了模板容器和包含类型的答案,但我试图调整它们以便修复包含的类型是不成功的.
我正在编写一个负责格式化和打印信息的方法.
有一个问题/功能boost::optional<T>,当输出到流时,只有当有值时才会输出额外的空格optional.
我可以看到两个选项:
boost::optional<T>boost::optional<T>并相应地处理它选项1可能是这样的:
template <typename T>
void print(const T& o)
{
std::cout << o << "\n";
}
template <typename T>
void print_optional(const boost::optional<T>& o)
{
if (o)
print(*o);
else
print("--");
}
Run Code Online (Sandbox Code Playgroud)
它有效,但它有一个问题,如果我们调用print()一个没有编译错误boost::optional.我知道static_assert并且std::is_type,但由于boost::optional本身是模板化的,我不知道如何检查它.
选项2对我来说是理想的,但问题仍然存在:如何询问代码变量boost::optional<T>是否与T无关?
我有一个控制台程序,该程序可能需要一些时间进行计算。我正在boost::progress_display向用户提供一些反馈。
我的问题是,如果发生某些情况,我还想将其他更新打印到标准输出,这会中断进度栏:
0% 10 20 30 40 50 60 70 80 90 100%
|----|----|----|----|----|----|----|----|----|----|
**Found temporary candidate with score: 40
Found temporary candidate with score: 46
*Found temporary candidate with score: 52
********Found temporary candidate with score: 55
**Found temporary candidate with score: 67
**************************************
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法来拥有进度条(理想情况下,在代码中与之一样是非侵入式的boost::progress_display)和更新屏幕?
编辑:在评论中的一条建议说我还没有提供我要寻找的示例之后,我想要看起来像这样的代码:
boost::progress_display progress(10);
for (size_t i = 0; i< 10; ++i)
{
std::cout << "Number is: " << i << "\n";
++progress;
}
Run Code Online (Sandbox Code Playgroud)
但这不会导致以下输出:
0% 10 20 30 40 …Run Code Online (Sandbox Code Playgroud) 我可能对动态链接的工作方式感到误解,因为我无法弄清楚。据我了解,动态链接库时,其符号在运行时解析。从这个答案:
当您动态链接时,可执行文件中将包含指向要链接的文件的指针(例如,文件的文件名),并且链接时不包含该文件的内容。只有当您以后运行该可执行文件时,这些动态链接的文件才被购买,并且它们仅被购买到该可执行文件的内存中副本中,而不是磁盘中的一个副本中。
[...]
在动态情况下,主程序与C运行时导入库(声明动态库中的内容但未实际定义的内容)链接在一起。即使实际的代码丢失,这也允许链接器链接。
然后,在运行时,操作系统加载程序将主程序与C运行时DLL(动态链接库或共享库或其他命名法)进行后期链接。
我对为什么g++动态链接到共享对象时似乎期望共享对象在那里感到困惑。当然,我希望库的名称是必需的,以便可以在运行时加载它,但是为什么.so在此阶段它是必需的?此外,g++在链接库时,抱怨未定义的引用。
我的问题是:
g++如果库的加载仅在运行时发生,为什么在动态链接共享对象时似乎需要共享对象?我知道-l指定共享对象的名称可能需要该标志,以便可以在运行时加载它,但是我看不出必须提供.so指向链接时间(-L)或.so自身的路径。g++在动态链接时尝试解析符号?没有什么可以阻止我.so在链接时完成操作,而是.so在运行时提供一个不同的(不完整的)消息,这会导致程序在尝试使用未定义的符号时崩溃。我举了一个可重现的例子:
.
??? main.cpp
??? test
??? usertest.cpp
??? usertest.h
Run Code Online (Sandbox Code Playgroud)
#ifndef USERTEST_H_4AD3C656_8109_11E8_BED5_5BE6E678B346
#define USERTEST_H_4AD3C656_8109_11E8_BED5_5BE6E678B346
namespace usertest
{
void helloWorld();
// This method is not defined anywhere
void byeWorld();
};
#endif /* USERTEST_H_4AD3C656_8109_11E8_BED5_5BE6E678B346 */
Run Code Online (Sandbox Code Playgroud)
#include "usertest.h"
#include <iostream>
void usertest::helloWorld()
{
std::cout << "Hello, world\n"; …Run Code Online (Sandbox Code Playgroud)