我目前在工作目录中有三个已修改的文件.但是我希望其中一个重置为HEAD状态.
在SVN我会使用svn revert <filename>
(svn update <filename>
如果需要的话后跟),但在git我应该使用git reset --hard
.但是,此命令无法在单个文件上运行.
有没有办法在git中丢弃单个文件更改并用新的HEAD副本覆盖它?
我对Android中的任务和进程之间的区别感到有点困惑.
如果我理解正确,任务只是一堆活动.从我到目前为止阅读的内容来看,我认为任务看起来像这样:
| Activity A running in Process P1 |
| Activity B running in Process P2 |
| Activity C running in Process P3 |
Run Code Online (Sandbox Code Playgroud)
所以基本上来自不同进程的活动可以包含在同一个堆栈中.我对么?
另一个问题:"应用程序上下文"的真正含义是什么?过程还是任务?
而最后一个问题:应用程序类(这基本上是一个单)表示进程或任务?
我正在学习pthread和等待条件.据我所知,一个典型的等待线程是这样的:
pthread_mutex_lock(&m);
while(!condition)
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
Run Code Online (Sandbox Code Playgroud)
我无法理解的是,while(!condition)
即使我pthread_cond_signal()
用来唤醒线程,为什么这条线是必要的.
我可以理解,如果我使用pthread_cond_broadcast()
我需要测试条件,因为我唤醒所有等待的线程,其中一个可以在解锁互斥锁之前再次使条件为假(从而将执行转移到另一个不应该执行的唤醒线程点).但是,如果我使用pthread_cond_signal()
我只唤醒一个线程,所以条件必须是真的.所以代码看起来像这样:
pthread_mutex_lock(&m);
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
Run Code Online (Sandbox Code Playgroud)
我读到了一些可能发生的虚假信号.这是(也是唯一的)原因吗?我为什么要有虚假的信号呢?或者还有其他我没有得到的东西?
我假设信号代码是这样的:
pthread_mutex_lock(&m);
condition = true;
pthread_cond_signal(&cond); // Should wake up *one* thread
pthread_mutex_unlock(&m);
Run Code Online (Sandbox Code Playgroud) 我必须在创建容器时在容器中注册它.没有智能指针,我会使用这样的东西:
a_class::a_class()
{
register_somewhere(this);
}
Run Code Online (Sandbox Code Playgroud)
使用智能指针我应该使用,shared_from_this
但我不能在构造函数中使用它.
有没有一个干净的方法来解决这个问题?在类似的情况下你会做什么?我正在考虑init
在创建之后引入一个方法来调用,并将所有内容放在像这样的工厂函数中:
boost::shared_ptr<a_class> create_a()
{
boost::shared_ptr<a_class> ptr(new a_class);
ptr->init();
return ptr;
}
Run Code Online (Sandbox Code Playgroud)
没有问题,或者在这种情况下有一个标准程序可以遵循?
编辑:其实我的情况更复杂.我有2个对象,它们将保持彼此的指针.所以事实是我不是"注册"而是创建另一个b_class
需要this
作为参数的对象(让我们说).作为弱指针b_class
接收this
并存储它.
我添加这个是因为你给我设计建议(非常感谢),至少你可以知道我在做什么:
a_class::a_class()
{
b = new b_class(this);
}
Run Code Online (Sandbox Code Playgroud)
在我的程序中a_class
是一个实体,b_class
是表示状态的具体类之一(在构造函数中它只是起始状态).a_class
需要指向当前状态的指针,b_class
需要操纵实体.
a_class
负责创建和销毁b_class实例,从而维护一个shared_ptr但b_class
需要操作a_class
并因此维护一个弱指针.a_class
实例"幸存" b_class
实例.
你建议在这种情况下避免使用智能指针吗?
我在Visual Studio 2010中有一个简单的解决方案,包含一些静态库,一些DLL和一个可执行文件.
一些库相互依赖(例如,DLL在构建DLL本身之前需要构建两个静态lib项目),并且似乎有两种方法可以实现此目的:
1)如果我右键单击解决方案,我可以选择"项目依赖项..."并设置构建顺序
2)我可以右键单击DLL项目并选择Properties-> Framework and References,然后添加一个新引用.
#1和#2有什么区别?在Visual Studio 2010中表达两个项目之间的构建依赖关系的更好方法是什么?
我是Windows编程的新手,我只是"迷失"两个小时寻找一个每个人都知道的错误:你不能在DLL中创建一个对象并在另一个DLL(或主程序)中销毁它.
我几乎可以肯定,在Linux/Unix上,情况并非如此(如果是的话,请说出来,但我很确定我做了数千次而没有问题......).
在这一点上,我有几个问题:
1)静态链接的DLL使用与主程序不同的堆吗?
2)静态链接的DLL是否映射在主程序的同一进程空间中?(我很确定这里的答案是一个很大的问题,否则将主程序中的函数指针传递给DLL中的函数是没有意义的.)
我说的是普通/常规DLL,而不是COM/ATL服务
编辑:通过"静态链接"我的意思是我不使用LoadLibrary加载DLL但我链接到存根库
我们假设我有一个这样的结构:
struct my_struct
{
int a;
int b;
}
Run Code Online (Sandbox Code Playgroud)
我有一个函数应该为"a"或"b"设置一个新值.此函数还需要指定要设置的变量.一个典型的例子是这样的:
void f(int which, my_struct* s, int new_value)
{
if(which == 0)
s->a = new_value;
else
s->b = new_value;
}
Run Code Online (Sandbox Code Playgroud)
由于我不会在这里写的原因,我无法将指针传递给a/b到f.所以我不能用my_struct :: a或my_struct :: b的地址调用f.我不能做的另一件事是在my_struct中声明一个向量(int vars [2])并将一个整数作为索引传递给f.基本上在f中我需要按名称访问变量.
以前的例子的问题是,在将来我计划向struct添加更多变量,在这种情况下,我将记得向f添加更多if语句,这对于可移植性是不利的.我能做的就是将f写为宏,如下所示:
#define FUNC(which)
void f(my_struct* s, int new_value) \
{ \
s->which = new_value; \
}
Run Code Online (Sandbox Code Playgroud)
然后我可以调用FUNC(a)或FUNC(b).
这可行,但我不喜欢使用宏.所以我的问题是:有没有办法使用模板而不是宏来实现相同的目标?
编辑:我将尝试解释为什么我不能使用指针,我需要按名称访问变量.基本上,结构包含系统的状态.该系统需要在请求时"撤消"其状态.使用名为undo_token的接口处理撤消,如下所示:
class undo_token
{
public:
void undo(my_struct* s) = 0;
};
Run Code Online (Sandbox Code Playgroud)
因此,由于多态性,我无法将指针传递给undo方法(mystruct也包含其他类型的变量).
当我向结构中添加一个新变量时,我通常还会添加一个新类,如下所示:
class undo_a : public undo_token
{
int new_value;
public:
undo_a(int new_value) { …
Run Code Online (Sandbox Code Playgroud) 以下代码是否正确?
char mychar = 200;
printf("%x", mychar);
Run Code Online (Sandbox Code Playgroud)
根据http://www.cplusplus.com/reference/clibrary/cstdio/printf/ %x
期望一个整数(我的编译器为4个字节),我在这里只传递1个字节.由于printf
使用了varargs,我担心这只会因为堆栈上的字节对齐而起作用(即,当在堆栈上按下时,char总是使用4个字节).
我认为最好写一下:
char mychar = 200;
printf("%x", static_cast<int>(mychar));
Run Code Online (Sandbox Code Playgroud)
你认为第一个代码是否安全?如果没有,如果我切换到bigendian架构,你认为我能得到不同的输出吗?
我有一个库创建对象(类A的实例)并将它们传递给python程序,该程序应该能够调用它们的方法.
基本上我有C++类实例,我想从python中使用它们.有时,该对象应该传递回C++进行一些操作.
我创建了以下包装器文件(假设该New
函数在C++代码中的某处调用):
#include <boost/python.hpp>
#include <iostream>
#include <boost/smart_ptr.hpp>
using namespace boost;
using namespace boost::python;
int calls = 0;
struct A
{
int f() { return calls++; }
~A() { std::cout << "destroyed\n"; }
};
shared_ptr<A> existing_instance;
void New() { existing_instance = shared_ptr<A>( new A() ); }
int Count( shared_ptr<A> a ) { return a.use_count(); }
BOOST_PYTHON_MODULE(libp)
{
class_<A>("A")
.def("f", &A::f)
;
def("Count", &Count);
register_ptr_to_python< shared_ptr<A> >();
}
Run Code Online (Sandbox Code Playgroud)
代码缺少python获取的部分existing_instance
.我没有粘贴它,但我只是说我为此目的使用回调机制.
这段代码有效,但我有几个问题:
在Count函数(以及所有其他C++操作函数中)可以这样传递a
或者更好地做类似的事情const shared_ptr<A>&
吗?在我在python …