小编jus*_*tin的帖子

如何使Factory的Header不依赖于它创建的模板化对象?

我有一个像这样的抽象基类:

class AbstractBaseClass
{}; 
Run Code Online (Sandbox Code Playgroud)

从中衍生出来的模板化具体类:

template<class T>
class ConcreteClass : public AbstractBaseClass
{
public:
   ConcreteClass(T input) : data(input) {}
private:
    T data;
};
Run Code Online (Sandbox Code Playgroud)

我有一个创建AbstractBaseClasses的工厂类

class MyFactory
{
public:
   boost::shared_ptr<AbstractBaseClass> CreateBlah();
   boost::shared_ptr<AbstractBaseClass> CreateFoo();

   template<class T>
   boost::shared_ptr<AbstractBaseClass> Create(T input)
   {
      return boost::shared_ptr<AbstractBaseClass>(new ConcreteClass<T>(input));
   }
};
Run Code Online (Sandbox Code Playgroud)

这个问题是,现在使用MyFactory的一切都必须将整个实现包含在ConcreteClass中.理想情况下,除了MyFactory之外我什么都不想了解ConcreteClass.

有没有办法设计这个来实现这个目标?(除了在MyFactory中为我想要的每种类型手动创建一个新的Create函数,而不是模板化它).

c++ dependencies templates design-patterns factory

5
推荐指数
2
解决办法
1223
查看次数

这些#import声明之间有什么区别?

我将从我的应用程序发送邮件,并添加了MessageUI框架.在Apple的示例代码中,他们写道:

#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>
Run Code Online (Sandbox Code Playgroud)

这些之间的区别是什么,以及"斜线"在那里做什么?

iphone import objective-c include

5
推荐指数
2
解决办法
479
查看次数

是否有从代码库中删除第三方C和C++库的好技巧或工具?(OS X或Linux)

我正在减少和隔离我对某些库的使用.我编写的许多现有程序直接使用这些库.我想要编译器(在这种情况下是GCC和/或Clang)或一些工具来帮助我识别我的代码库中的这些用法.简而言之,我想在代码库中毒害这些库的使用,除了它们将由一个库使用,并且我的代码库中的其他模块可以看到一个库.

问题:

1)你知道可以帮助我的工具吗?

2)或者你能推荐一些策略来简化这个过程吗?

条件和细节:

  • 删除其包含不是一种选择.
  • 由于我的代码库大小和我想要隔离的符号数,搜索无效.
  • 鉴于代码库的复杂性和要删除的符号数量,使用重构工具将太繁琐.
  • 由于第三方库中的声明数量,不能单独弃用符号.
  • 第三方库接口主要用C语言编写.
  • 翻译将是C++和Objective-C++.
  • 对于我的构建配置方式,预处理器技巧并不优雅,并且会改变太多文件.
  • 每次最后一次使用都不需要消除.理想情况下,它们会是,但大多数用途都令人满意.这不是一个要求,因为有太多的更新.
  • 在这种情况下,从链接阶段删除它们不是一个好的选择(在Update#3中有详细说明).
  • 理想情况下,这个工具或策略可以在OS X上使用,但我也可以构建一大堆针对Linux的程序.

一些策略已经浮现在脑海中:

到目前为止,我为此案例提出的最好的方法是重新声明库使用的类型,并使用不推荐使用的属性来装饰它们:

typedef IHREType IHREType __attribute__((__deprecated__));
Run Code Online (Sandbox Code Playgroud)

但这并不能涵盖所有情况,经过几次迭代后,信噪比会非常高.

另一种方法是在我使用的根命名空间中重新声明这些类型:

namespace MON {
typedef t_poisoned IHREType;
}
Run Code Online (Sandbox Code Playgroud)

但那会变得有点乱.

所以我想我将从弃用的属性策略开始,但在我这样做之前,我认为其他人已经解决了这个问题并且会知道更好的解决方案.

更新#1

  • K-ballo提到了一个很好的策略(通过包含中毒).不幸的是,在我的情况下,我想要隔离的API也无法在系统框架中找到,这些系统框架通过我不希望隔离的API包含在内.

更新#2

由于响应数量较少,因此添加了Linux.

更新#3

> > Justin: Removing them from the link stage is not a good option in this case.
> thiton: Why not? 
Run Code Online (Sandbox Code Playgroud)

详细说明这一点:我喜欢此时图书馆和项目的布局方式.有静态和动态库的组合.改变该结构并同步依赖关系是耗时的(尽管隔离的情况可能是一些库的时间利用很好......).链接器还解析了由于依赖性而要删除的大量符号(例如,在系统库中).

我接近这个计划

代码库中有数百个Xcode项目(为其他构建器/ IDE添加到该项目).

我将在这里关注这些更新几天,并在那里停留几天; 100%的覆盖率不是这个时间范围的现实目标,也不是目前的要求.由于任务的大小和代码库的当前状态,我想重点关注此时按编号删除出现的情况.按编号删除也是优选的,因为它最终将导致更少的时间构建(需要一段时间来构建这一切).一旦减少,我将转向彻底消除 - 至少,这是我目前的计划.在这种情况下,我有时间执行更新,但它还不是很紧急.如果您的建议偏离此模型,我确实具有灵活性.

c c++ deprecated dependency-management

5
推荐指数
1
解决办法
738
查看次数

AudioFileSetProperty返回'kAudioFileUnsupportedPropertyError(pty?)'

我在编写音频文件的元数据时遇到了困难:

AudioFileID fileID = nil;
AudioFileOpenURL((__bridge CFURLRef) url, kAudioFileReadWritePermission, 0, &fileID );
CFDictionaryRef piDict = nil;
UInt32 piDataSize   = sizeof(piDict);   
AudioFileGetProperty( fileID, kAudioFilePropertyInfoDictionary, &piDataSize, &piDict );
NSLog(@"%@", (__bridge NSDictionary *)piDict);

NSMutableDictionary *dict = (__bridge NSMutableDictionary*)piDict;
[dict setObject:@"NEW ALBUM NAME" forKey:@"album"];
piDict = (__bridge CFDictionaryRef)dict;
piDataSize = sizeof(dict);
OSStatus status = AudioFileSetProperty(fileID, kAudioFilePropertyInfoDictionary, piDataSize, &piDict);
Run Code Online (Sandbox Code Playgroud)

第6行的NSLog给了我一个包含ID3信息的好词典.但是当我想改变时(例如专辑名称,第9行)我得到一个OSStatus'pty?' 作为回报.

谁能指点我做错了什么的人.或者甚至可以更好/更简单/更快速地编辑音频文件的ID3标签/元数据.

iphone audio id3 ios

5
推荐指数
1
解决办法
1971
查看次数

'删除指针'只是意味着'*指针= 0'吗?

# include <iostream>

int main()  
{  
using std::cout;
int *p= new int;

*p = 10;
cout<<*p<<"\t"<<p<<"\n";
delete p;
cout<<*p<<"\t"<<p<<"\n";

return 0;

}
Run Code Online (Sandbox Code Playgroud)

输出:
10 0x237c010
0 0x237c010

在删除p之后,为什么指针p保持其值?不删除释放指针p?
究竟是什么意思'释放指针'?
"删除p"只是意味着'*p = 0'吗?(从输出看来)

c++ free destructor memory-management delete-operator

5
推荐指数
1
解决办法
1193
查看次数

Xcode 4.2 + c ++ 0x/libc ++找不到iostream

我正在使用Macbook 1g,Snow Leopard.

几天前我安装了xcode 4.2并为c ++ 0x做了一个测试项目.

我将LLVM 3.0设置为c ++编译器,将C++语言方言设置为C++ 0x,将C++标准库设置为libc ++.

但在建设时,发生了错误.

"iostream" file not found
Run Code Online (Sandbox Code Playgroud)

我觉得最令人困惑.我怎么解决这个问题?

xcode llvm osx-snow-leopard c++11 libc++

4
推荐指数
1
解决办法
6511
查看次数

使用BLAS或LAPACK与Xcode

我正在寻找一个很好的指南,介绍如何将BLAS或LAPACK函数合并到我通过Xcode开发的Objective C程序中.我可以在线找到BLAS/LAPACK中程序的唯一来源是用Fortran编写的 - 这很令人困惑.如何在Objective C中使用BLAS/LAPACK和代码?有没有在线示例/指南?我希望能够执行矩阵运算,其中矩阵的元素具有复杂的值.

干杯,

Shaddy

xcode objective-c blas complex-numbers lapack

4
推荐指数
1
解决办法
3640
查看次数

如何调用我使用NSClassFromString动态创建的类中的方法?

我正在进行动态类加载的原因是因为我创建了一组可以在多个类似项目中使用的文件,因此执行#import然后正常实例化将无法正常工作.动态类允许我这样做,只要我可以在这些类中调用方法.每个项目在pch中都有一个不同的"kMediaClassName"名称,所以我可以根据我所在的项目动态加载不同的类:

#define kMediaClassName @"Movie"
Run Code Online (Sandbox Code Playgroud)

这是我用来动态获取类实例的代码:

Class mediaClass = NSClassFromString(kMediaClassName);
id mediaObject = [[[mediaClass alloc] init] autorelease];
Run Code Online (Sandbox Code Playgroud)

然后我尝试在该动态类中调用一个方法:

[mediaObject doSomething];
Run Code Online (Sandbox Code Playgroud)

当我将其键入Xcode时,编译器会显示一个警告,即该类没有此方法,即使它有.我可以在我的Movie.h文件中看到它.到底是怎么回事?如何从动态实例化的类中调用方法?

如果我需要传递多个参数怎么办?

[mediaObject loadMedia:oneObject moveThe:YES moveA:NO];
Run Code Online (Sandbox Code Playgroud)

我在这里先向您的帮助表示感谢.

iphone xcode cocoa dynamic objective-c

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

字典的深层副本在Xcode 4.2中给出了分析错误

我在NSDictionary类别中有以下方法,可以进行深层复制,工作正常.

我刚从Xcode 4.1升级到4.2,Analyze函数为此代码提供了两个分析器警告,如下所示:

- (id)deepCopy;
{
    id dict = [[NSMutableDictionary alloc] init];
    id copy;

    for (id key in self)
    {
        id object = [self objectForKey:key];

        if ([object respondsToSelector:@selector(deepCopy)])
            copy = [object deepCopy];
        else
            copy = [object copy];

        [dict setObject:copy forKey:key];

        // Both -deepCopy and -copy retain the object, and so does -setObject:forKey:, so need to -release:
        [copy release];  // Xcode 4.2's Analyze says this is an incorrect decrement of the reference count?!
    }

    return dict;  // Xcode 4.2's Analyze says …
Run Code Online (Sandbox Code Playgroud)

cocoa deep-copy analyzer clang-static-analyzer xcode4.2

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

我在C++析构函数中对垃圾收集有什么作用?

我正在编写一个C++析构函数(我希望这是正确的术语;我是C++的新手)并且我对垃圾收集的确切需要并不是肯定的.假设我有2个指针作为实例变量我需要垃圾收集吗?如果我有一个对象作为实例变量呢?或指向对象的指针?

对于究竟需要删除的内容以及自动清理的内容,我只是有点模糊.

谢谢

c++ destructor memory-management smart-pointers raii

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