小编nac*_*o4d的帖子

如何在C++中实现回调?

我想在c ++中实现一个具有回调的类.

所以我想我需要一个有两个参数的方法:

  • 目标对象.(让我们说*myObj)
  • 指向目标对象的成员函数的指针.(所以我可以做*myObj-> memberFunc();)

条件是:

  • myObj可以来自任何一个类.

  • 将成为回调函数的成员函数是非静态的.

我一直在读这个,但看起来我需要事先了解myObj的类.但我不知道该怎么做.我怎么处理这个?这在C++中是否可行?

这是我想到的,但肯定是不正确的.

class MyClassWithCallback{
public
    void *targetObj;
    void (*callback)(int number);
    void setCallback(void *myObj, void(*callbackPtr)(int number)){
        targetObj = myObj;
        callback = callbackPtr;
    };
    void callCallback(int a){
        (myObj)->ptr(a);
    };
};
class Target{
public
    int res;
    void doSomething(int a){//so something here. This is gonna be the callback function};        
};

int main(){
    Target myTarget;
    MyClassWithCallback myCaller;
    myCaller.setCallback((void *)&myTarget, &doSomething);
Run Code Online (Sandbox Code Playgroud)

}

我感谢任何帮助.

谢谢.

更新大多数人说观察和代表,这就是我正在寻找的,我是一个Objective-C/Cocoa头脑的家伙.我目前的实现是使用具有虚函数的接口.我只是认为传递对象和成员函数指针(如boost!)而不是定义接口会"更聪明".但似乎每个人都认为Interfaces是最简单的方法吗?Boost似乎是一个好主意,(假设已安装)

c++ callback

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

迭代时删除

可能重复:
Vector.erase(Iterator)导致错误的内存访问
迭代向量,删除某些项目.

嗨,我写了这个,但运行时我遇到了一些错误

for (vector< vector<Point> >::iterator track = tracks_.begin(); track != tracks_.end(); track++) {
        if (track->empty()) { // if track is empty, remove it
            tracks_.erase(track);
            track++; // is this ok?
        }else {   //if there are points, deque
            track->erase(track->begin()); //my program crashes here after a while... ;(
        }
    }
Run Code Online (Sandbox Code Playgroud)

我有一个矢量点(2英寸)矢量我称之为轨道(1个轨道是1个点矢量)我想检查每个轨道,如果它们包含点,则删除第一个,否则删除轨道.它是否正确?

提前致谢.

c++ stl

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

如何将我的应用限制为横向模式?

我使用SplitView模板创建了我的iPad应用程序.我想知道将我的应用程序限制为横向模式的最佳方法是什么?

我试过shouldAutorotateToInterfaceOrientation:在DetailViewController.m中重写 方法

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}
Run Code Online (Sandbox Code Playgroud)

但是4.2 GM仍然是有缺陷的,它无法显示控制器视图.我还有其他选择吗?

提前致谢.

UPDATE1

  • 我已经提交了错误报告: 错误ID#8620135

  • 我的应用程序几乎已经完成,我必须找到一个工作周期,因为我认为他们不会在4.2正式发布之前解决这个问题(GM已经出局!)

    为了重新创建bug,只需在任何UIViewControllers(RootViewController或DetailViewControllers)中使用SplitView模板并覆盖上面的方法

UPDATE2

我找到了解决办法.(有关完整的解决方法,请参阅UPDATE3)

设置UISupportedInterfaceOrientations仅支持横向,这将强制应用程序以横向模式启动,允许DetailViewController正确启动(因此显示正确)

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>
Run Code Online (Sandbox Code Playgroud)

但是如果你旋转设备,它会变成肖像模式!!!,所以仍然需要覆盖 shouldAutorotateToIntercafeOrientation:如上所述

讨论:

如果这不是一个错误,我会期望在视图控制器不支持的方向启动应用程序时出现警告或执行错误,异常或其他问题.此外,为什么只有DetailViewController不显示?如果这是规范,那么RootViewController也应该无法加载.你不觉得吗?谢谢你的帮助...;)

UPDATE3

经过进一步测试后,我意识到上述解决办法在某些情况下不起作用.例如,当设备处于横向状态时启动应用程序将无法正常工作!真正的问题似乎是在iOS4.2GM中,UISplitViewController需要其所有控制器在其加载时具有所有旋转.因此有必要欺骗他,以便在横向模式下加载,然后不允许他旋转其视图控制器.

所以这是烦人的iBug的新解决方案.

第1步:像这样设置Info.plist:

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>
Run Code Online (Sandbox Code Playgroud)

Step2在DetailViewController.m或.h中设置一个新标志(来自SplitView模板)

BOOL lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    //WORK-ARROUND: Bug ID# 8620135.
    if (lockRotation) {
        return UIInterfaceOrientationIsLandscape(interfaceOrientation);
    }else{
        return YES;
    }
}
- (void)viewDidLoad {
    [super viewDidLoad];
    //set NO here since this …
Run Code Online (Sandbox Code Playgroud)

iphone cocoa-touch landscape orientation ipad

13
推荐指数
1
解决办法
8043
查看次数

警告:案例未以枚举类型进行评估?

我最近升级到新的编译器Clang LLVM 4.0和它的好.就在这种情况下,它向我显示了一些旧的遗留代码的丑陋警告:

警告: case value not in enumerated type 'SomeConstants' (aka 'enum SomeConstants') [-Wswitch]

switch (var) {
    case kConstant: case 3: case 4: case 8: case 35: //WARNING HERE :(
    // do my thing here
    break;
    case kOtherConstant:
    // do another thing here
    break;
    default:
    break;
}
Run Code Online (Sandbox Code Playgroud)

var 可能是枚举中定义的值之一:

typedef enum SomeConstants {
    kConstant,
    kOtherConstant,
};
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,2,4,8,35没有定义(这就是编译器正在编译的原因),但实际上它们发生了(这是我正在使用的这个封闭源库的模糊部分).

有没有办法可以以某种方式修改我的开关代码,所以我没有得到无害但恼人的警告?现在我用它来沉默它:

switch (var) {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wswitch"
    case kConstant: case 3: case 4: case 8: case …
Run Code Online (Sandbox Code Playgroud)

c gcc clang

13
推荐指数
1
解决办法
5310
查看次数

如何在调试时从块访问self或ivars

在调试器(gdb和llvm)中,

我经常这样做:

po self
po myIvar
p (CGPoint)whatEver
Run Code Online (Sandbox Code Playgroud)

并且工作正常,除非我在一个街区内.如何在调试器中访问它们?我不喜欢到处写NSLogs ......

我想内部块在调试器中我需要以不同的方式访问ivars但我不知道如何:(

debugging gdb block objective-c llvm

12
推荐指数
1
解决办法
1659
查看次数

警告:XXXX在YYYY中具有不同的可见性(默认),在ZZZZ中具有(隐藏)

我正在尝试制作一个使用OpenCV和另一个C++库的iPhone应用程序.它似乎编译和链接很好.它确实有效.我只是想摆脱这个丑陋的警告:

ld: warning: std::vector<int, std::allocator<int> >::_M_insert_aux(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, int const&)has different visibility (default) in /Users/nacho4d/Documents/Projects/iOS/iAR/opencv_device/lib/libcxcore.a(cxdatastructs.o) and (hidden) in /Users/nacho4d/Documents/Projects/iOS/iAR/build/iAR.build/Debug-iphoneos/iAR.build/Objects-normal/armv6/combination.o
Run Code Online (Sandbox Code Playgroud)

这是什么意思?,我该如何解决?

以防万一,这是组合类的标题,来自我提到的库.

//combination.h
typedef std::vector<int> combi;
typedef std::vector< combi > allcombi;
class Combination
{
public:
    void Init(const int n, const int m);
    allcombi::iterator begin();
    allcombi::iterator end();
    allcombi::const_iterator begin() const;
    allcombi::const_iterator end() const;
private:
    void Nest(int nest, int column, int n1, int n2, int k[], allcombi &result);
private:
    allcombi m_data;
};
Run Code Online (Sandbox Code Playgroud)

提前致谢

伊格纳西奥

c++ iphone opencv

11
推荐指数
1
解决办法
2724
查看次数

在没有合并的情况下加入各种提交

是否可以加入各种提交?

这是我的情况:

我的应用程序在OSX 10.6和10.7中运行,因此我修复了10.6然后提交的一些内容,更改为10.7并再次修复了修复程序以便它们兼容,然后再次提交.然后回到10.6并再次检查并再次进行一次小型提交等(总共提交三次或四次提交,所有这些提交都是针对同一问题)

如你所见,所有这些提交密切相关,所以我想加入他们,这可能吗?

我仍然需要再处理一个问题,所以我不打算合并当前的分支.理想情况下,我希望每个问题只有一个提交/我解决的bug.

编辑:

我已经推送了我的提交,因为我必须在不同的计算机上执行此操作,但该分支未被其他人使用,尚未使用.

git

11
推荐指数
1
解决办法
2704
查看次数

运行`git diff`时如何控制围绕每个差异的行数?

根据我的情况,diff有时我想在+插入-删除的上方和下方看到几行(比如10),有时我只想看到围绕它们的几条线.

有没有办法告诉git他应该告诉我的行数?

git version-control

11
推荐指数
2
解决办法
3402
查看次数

如何打印到同一行,覆盖前一行?

有时我在终端中看到一些命令将结果打印到stdout但在同一行.例如,wget打印如下箭头:

0[=>        ]100%
0[  =>      ]100%
0[    =>    ]100%
0[      =>  ]100%
0[        =>]100%
Run Code Online (Sandbox Code Playgroud)

但它打印到同一行,所以看起来箭头正在移动.如何使用bash或sh在我的程序中实现相同的功能?我需要使用其他工具吗?

更新:

我知道我提到了wget,它默认出现在linux,基于GNU的unices中......是否有一种适用于BSD的通用方法?(比如OSX) - >好的,如果我使用bash而不是sh那么它的工作原理:)

bash shell

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

跨浏览器随机字符串(Math.random()*1e32).toString(36)

(Math.random()*1e32).toString(36)用作一个简单的随机字符串生成器.它非常简单,运行良好,满足了我的需求(用于id的时间随机等)

在chrome,safari,firefox和ie Math.random()*1e32生成的数字如:8.357963780872523e+31:-)

  • 在chrome,safari和firefox这样的数字转换成字符串(8.357963780872523e+31).toString(36)- > 221fr2y11ebk4cog84wok这正是我想要的.
  • 但是在ie11中,字符串结果是6.936gwtrpf69(e+20).

我怎样才能得到相同的字符串221fr2y11ebk4cog84wok8.357963780872523e+31一个跨浏览器的方式?

顺便说一句:我从这个帖子中得到了这个随机字符串的想法:JavaScript中的随机字母数字字符串?

javascript

11
推荐指数
1
解决办法
677
查看次数