我"长大"学习使用OOP设置数据结构.但是现在随着我对C++,STL和Boost的了解越来越多,我发现通过将STL类组合成更复杂的组合,可以满足我的许多数据结构需求:
typedef std::map<std::string, std::map<std::string, int> > CSVData;
Run Code Online (Sandbox Code Playgroud)
显然,当我需要混合数据类型时,这是有限制的,但一般来说,当我能够支持这些STL复合材料时,我发现自己避免使用OOP.这是一个普遍的进展吗?当最好定义自己的类时,是否有最佳实践经验法则?这有什么常见的陷阱吗?
我正在使用VBA开发Excel(2010+)应用程序,并遇到一个问题,一旦查询完成执行,就不会调用AfterRefresh事件函数.
我无法找到许多有关如何在类模块中触发此事件功能的合适资源或文档.我决定使用类模块设计路线,而不是在收到有关QueryTables的早期问题(在此处找到Excel VBA AfterRefresh)的响应后,将事件处理程序放在工作表中.
这是我的类模块的代码,称为CQtEvents
Option Explicit
Private WithEvents mQryTble As Excel.QueryTable
Private msOldSql As String
' Properties
Public Property Set QryTble(ByVal QryTable As QueryTable): Set mQryTble = QryTable:
End Property
Public Property Get QryTble() As QueryTable: Set QryTble = mQryTble:
End Property
Public Property Let OldSql(ByVal sOldSql As String): msOldSql = sOldSql:
End Property
Public Property Get OldSql() As String: OldSql = msOldSql:
End Property
Private Sub Class_Initialize()
MsgBox "CQtEvents init"
End Sub
' Resets the query …
Run Code Online (Sandbox Code Playgroud) 我正在尝试扩展cocos2d-x CCMenuItem组件,并遇到了我以前在C++中没有见过的东西.如果有人详细说明他们的函数指针声明发生了什么会很有帮助
大多数cocos2d-x对象的基类是CCObject,它具有以下定义
class CC_DLL CCObject : public CCCopying
{
public:
// Code omitted
};
// The part in which I have a question about
typedef void (CCObject::*SEL_SCHEDULE)(float);
typedef void (CCObject::*SEL_CallFunc)();
typedef void (CCObject::*SEL_CallFuncN)(CCNode*);
typedef void (CCObject::*SEL_CallFuncND)(CCNode*, void*);
typedef void (CCObject::*SEL_CallFuncO)(CCObject*);
typedef void (CCObject::*SEL_MenuHandler)(CCObject*);
typedef void (CCObject::*SEL_EventHandler)(CCEvent*);
typedef int (CCObject::*SEL_Compare)(CCObject*);
#define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR)
#define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)
#define callfuncN_selector(_SELECTOR) (SEL_CallFuncN)(&_SELECTOR)
#define callfuncND_selector(_SELECTOR) (SEL_CallFuncND)(&_SELECTOR)
#define callfuncO_selector(_SELECTOR) (SEL_CallFuncO)(&_SELECTOR)
#define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR)
#define event_selector(_SELECTOR) (SEL_EventHandler)(&_SELECTOR)
#define compare_selector(_SELECTOR) (SEL_Compare)(&_SELECTOR)
Run Code Online (Sandbox Code Playgroud)
因此,在CCObject类之外,但在cocos2d命名空间内,存在一个函数指针和辅助宏的声明来使用它们.我是否正确调用函数指针的这些声明?
我理解typedef是将一个关键字与一个类型相关联(参见Typedef函数指针?),并且返回类型必须是void,并且该函数必须有一个CCObject*的必需参数.但是我很难理解它的适当用法,范围以及C++如何处理通过另一个函数传递函数.
问题1
我没有按照如何解释声明的函数指针的范围.在它们的声明中,它们显示了由CCObject类限定的函数指针.我该怎么解释这个?这是否意味着分配该函数属于CCObject的成员函数?这让我感到困惑,因为它是在类体外部定义的,但是使用了CCObject作用域. …
一些背景:我正在构建一个C++
线程管理器,它允许用户创建一个AsyncJob
对象并分配执行优先级。我有一个JobManager
单例类,它管理这些的优先级队列AsyncJobs
,并在可用时将它们分配给线程。
问题:用户需要能够修改优先级AFTER
创建。例如,基于某些运行时事件,某个文件可能需要比其他文件更紧急地加载。我面临的问题是,优先级队列仅在调用push()
或时对内部堆上的元素进行重新排序。pop()
据我所知,没有公开的界面允许人们根据不断变化的优先级请求重新排序。
我想做的是这样的:
hashmap
在我的类中创建一个JobManager
,它保存指向优先级队列中对象的指针JobManager
向优先级队列发出优先级已更改的信号解决这个问题的最佳方法是什么?我应该创建自己的自定义优先级队列类吗?或者也许从 延伸std::priority_queue
?
谢谢!
c++ multithreading asynchronous priority-queue data-structures
我有一个用旧版Xcode编写的应用程序.现在我正在使用Xcode 4.6.1.这是我从另一个在公司外部开发的开发人员继承的应用程序.
这个应用程序的一个问题是它的界面.它应该默认为LandscapeLeft(这是pList文件中设置的值).该应用程序忽略此指令,而是默认为纵向模式.
我是否需要做些什么来强制代码来兑现这个值?我对iOS/Objective-C比较陌生.代码编译并运行,只是界面没有做我想要的.
这是一个更容易,因为这是一个仅限iPad的应用程序.
编辑 我已经尝试将以下代码添加到我的一个有问题的viewControllers,但它没有被尊重.关于如何强迫这种观点进行景观的任何想法?(IDE中是否有设置 - 看起来Xcode曾经有一个方向属性,但我在4.6.1中找不到它)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Overriden to allow any orientation.
return ((interfaceOrientation==UIInterfaceOrientationMaskLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationMaskLandscapeRight));
}
- (NSUInteger) supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscapeLeft;
}
- (NSInteger) supportedInterfaceOrientationsForWindow
{
return UIInterfaceOrientationMaskLandscape;
}
- (BOOL) shouldAutoRotate
{
return YES;
}
Run Code Online (Sandbox Code Playgroud) 只是为了看看我对++c
/c++
运算符的工作原理了解多少,我尝试运行这些 C 程序:
int c = 5;
c = c - c++;
printf("%d\n", c);
Run Code Online (Sandbox Code Playgroud)
打印 1,我猜逻辑是 ++ 在使用它的代码行之后应用,因此c
变为= c - c
0,并在“下一行”增加一。但对我来说似乎很奇怪,我想更详细地了解操作员优先级应该发生什么。
现在开始:
int c = 5;
c = c - ++c;
printf("%d\n", c);
Run Code Online (Sandbox Code Playgroud)
这个打印0,我真的不明白为什么。如果从左到右解析右手值,我想它会读取c
哪个是 5,然后++c
哪个是 6,因为它应该立即应用。或者它是否++c
在整个右手值计算之前计算,因此它实际上是在做 6 - 6,因为增量还涉及第一次调用c
?
我需要将一个C结构转换为TLV格式并将其发送出去.有人可以帮我吗?我的结构是一个非常嵌套的结构,有很多向不同结构的方向(指针)和大量的void*.所以,我被困住了,可以使用帮助.
struct a {
char a[100];
char b;
struct b *tag;
struct c *value;
void *data;
};
struct b {
void *data;
int a;
};
struct c {
void *data;
char arr[100];
};
Run Code Online (Sandbox Code Playgroud) 假设我创建std::vector<int*> myVec;
并保留100个条目,并使用值填充向量,以便所有100个元素都具有有效的指针。然后,我缓存一个指向其中一个元素的指针,
int * x = myVec[60];
Run Code Online (Sandbox Code Playgroud)
然后,如果我追加另一个int *
由于堆碎片而触发大小调整以及移动的操作,则指向该指针的先前指针会失效还是指向内存中的新位置?
如果我的内存服务器正确,则示例在std::vector<int> myVecTwo
与上述相同的条件下运行,并且我存储了ptr
int * x = &myVecTwo[60];
Run Code Online (Sandbox Code Playgroud)
并继续追加和调整大小,该指针将无效。
因此,我的问题如下。指向指针的指针会失效吗?由于is_trivially_copyable的新C ++ std功能以及std :: vector是否利用此类功能或POD检查,我不再确定。
指针在C ++ 11中会无效吗?
在C++中,我可以通过引用传递指针
void someFunction(int * & x) {
...
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在Objective-C .mm文件中使用相同的语法时,编译器会因为链接器错误而对我大吼大叫,说这些是arm 7体系结构中的未识别符号.
我有一个Box2D辅助函数,定义如下
bool isBodyCollidingWithDestTerrain(b2Body * body, DestuctibleTerrain * dter, CGPoint * colPt) {
...
}
Run Code Online (Sandbox Code Playgroud)
我希望能够通过引用传递DestructibleTerrain*,这样我就可以将指针指向指向碰撞中涉及的DestructibleTerrain的指针.
我对Objective-C的了解有限,我将不胜感激.
自从4.3发布以来,我在Android中的我的payement webview遇到了问题.
我想是由于SSL证书重定向,但我无法改变它.
我尝试了三星或sony <4.2的网址,但是在两个不同的4.3 nexus上我得到了这个转储.
08-08 17:22:38.619: E/AndroidRuntime(7568): FATAL EXCEPTION: WebViewCoreThread
08-08 17:22:38.619: E/AndroidRuntime(7568): java.lang.StringIndexOutOfBoundsException: length=0; index=-1
08-08 17:22:38.619: E/AndroidRuntime(7568): at java.lang.AbstractStringBuilder.indexAndLength(AbstractStringBuilder.java:212)
08-08 17:22:38.619: E/AndroidRuntime(7568): at java.lang.AbstractStringBuilder.charAt(AbstractStringBuilder.java:206)
08-08 17:22:38.619: E/AndroidRuntime(7568): at java.lang.StringBuffer.charAt(StringBuffer.java:346)
08-08 17:22:38.619: E/AndroidRuntime(7568): at com.android.org.bouncycastle.asn1.x509.X509NameTokenizer.nextToken(X509NameTokenizer.java:78)
08-08 17:22:38.619: E/AndroidRuntime(7568): at com.android.org.bouncycastle.asn1.x509.X509Name.<init>(X509Name.java:719)
08-08 17:22:38.619: E/AndroidRuntime(7568): at com.android.org.bouncycastle.asn1.x509.X509Name.<init>(X509Name.java:655)
08-08 17:22:38.619: E/AndroidRuntime(7568): at com.android.org.bouncycastle.asn1.x509.X509Name.<init>(X509Name.java:593)
08-08 17:22:38.619: E/AndroidRuntime(7568): at android.net.http.SslCertificate$DName.<init>(SslCertificate.java:379)
08-08 17:22:38.619: E/AndroidRuntime(7568): at android.net.http.SslCertificate.<init>(SslCertificate.java:189)
08-08 17:22:38.619: E/AndroidRuntime(7568): at android.net.http.SslCertificate.<init>(SslCertificate.java:178)
08-08 17:22:38.619: E/AndroidRuntime(7568): at android.webkit.BrowserFrame.setCertificate(BrowserFrame.java:1206)
08-08 17:22:38.619: E/AndroidRuntime(7568): at android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
08-08 …
Run Code Online (Sandbox Code Playgroud)