我常用的一组 API 遵循链表模式:
struct SomeObject
{
const char* some_value;
const char* some_other_value;
SomeObject* next;
}
LONG GetObjectList( SomeObject** list );
void FreeObjectList( SomeObject* list );
Run Code Online (Sandbox Code Playgroud)
这个 API 不是我的,我不能改变它。
所以,我想封装它们的构造/销毁、访问和添加迭代器支持。我的计划是做这样的事情:
/// encapsulate access to the SomeObject* type
class MyObject
{
public:
MyObject() : object_( NULL ) { };
MyObject( const SomeObject* object ) : object_( object ) { };
const char* SomeValue() const
{
return NULL != object_ ? object_->some_value : NULL;
};
const char* SomeValue() const
{
return NULL != …Run Code Online (Sandbox Code Playgroud) 我有一个执行测试用例的C++应用程序.某些测试用例可能依赖于其他测试用例的输出.
所有测试用例都实现了基本接口:
/// base class for all test cases
class ITest
{
public:
virtual void Execute() = 0;
};
Run Code Online (Sandbox Code Playgroud)
产生一些可能对其他测试用例有用的对象的测试用例实现了这个接口:
/// implemented by test cases that provide data to other test cases
template< class Obj >
class IDependency
{
public:
virtual Obj Get() = 0;
};
Run Code Online (Sandbox Code Playgroud)
需要来自其他测试用例的数据的测试用例实现此接口:
/// implemented by test cases that require data from other test cases
template< class Obj >
class IDependent
{
public:
void SetDependency( IDependency< Obj >* dependency )
{
dependency_ = dependency;
};
protected: …Run Code Online (Sandbox Code Playgroud) 我有一个如下所述的状态机.
我们可以从两种起始状态中的一种开始,但我们必须触及握手的所有4种状态.从那里,我们可以传输数据的有效载荷或接收数据的有效载荷.然后,我们回到原来的起始状态.
握手:
- > StartingState1 - > FinalState1 - > StartingState2 - > FinalState2
- > StartingState2 - > FinalState2 - > StartingState1 - > FinalState1
有效负载转移:
- > SendPayload - > SendEnd - > StartingState?
- > ReceivePayload - > ReceiveEnd - > StartingState?
下面的代码代表了我当前的架构.不幸的是,在每个过程结束时,我没有从州内获得足够的信息来了解我应该触及的下一个状态.
有没有人对如何根据我的要求改进这种架构有任何建议?
谢谢,PaulH
class MyMachine;
class Payload;
class IState
{
MyMachine* context_;
IState( MyMachine* context ) : context_( context) {};
virtual void Consume( byte data );
void ChangeState( IState* state )
{
context_->SetState( state …Run Code Online (Sandbox Code Playgroud) 我有一个Windows Mobile 6 ARMV4I项目,我希望获得程序计数器的值.
该函数声明如下:
extern "C" unsigned __int32 GetPC();
Run Code Online (Sandbox Code Playgroud)
我的汇编代码如下所示:
GetPC FUNCTION
EXPORT GetPC
ldr r0, [r15] ; load the PC value in to r0
mov pc, lr ; return the value of r0
ENDFUNC
Run Code Online (Sandbox Code Playgroud)
但是,当我调用该GetPC()函数时,我每次都得到相同的数字.所以,我假设我的集会没有做我认为它正在做的事情.任何人都可以指出我可能做错了什么吗?
谢谢,PaulH
我有一个Visual Studio 2008 C#.NET 2.0 CF项目,其中一个抽象类派生自Component.从该课程中,我得出了几个具体的类(如下面的例子).但是,当我去退出我的Form时,虽然调用了Form的Dispose()成员并且调用了components.Dispose(),但我的组件从未被释放.
任何人都可以建议我如何修复这个设计?
public abstract class SomeDisposableComponentBase : Component
{
private System.ComponentModel.IContainer components;
protected SomeDisposableComponentBase()
{
Initializecomponent();
}
protected SomeDisposableComponentBase(IContainer container)
{
container.Add(this);
Initializecomponent();
}
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
protected abstract void Foo();
#region IDisposable Members
bool disposed_;
/// Warning 60 CA1063 : Microsoft.Design : Ensure that 'SomeDisposableComponentBase.Dispose()' is declared as public and sealed.*
public void Dispose()
{
// never called
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
// …Run Code Online (Sandbox Code Playgroud) 我有一个使用 WTL 8.1 开发的适用于 Windows XP SP3 的 VS2008 C++ 应用程序。我的应用程序包含一个选项卡控件,该控件在调整应用程序边框大小时会闪烁。
我的窗口层次结构如下所示:
CFrameWindowImpl CMainFrm
|-CSplitterWindow Splitter
|-CTabView Configuration Tabs
| |-CDialogImpl Configuration View 1
| |-CDialogImpl Configuration View 2
| |-CDialogImpl Configuration View 3
|-CDialogImpl Control View
Run Code Online (Sandbox Code Playgroud)
我尝试的解决方案是使CFrameWindowImpl派生类使用该WS_EX_COMPOSITED样式,并且其下面的所有窗口都使用该WS_EX_TRANSPARENT样式。不幸的是,这使得选项卡控件按钮显示为空黑条,并且任何配置视图的控件根本不显示。
如果我删除WS_EX_COMPOSITED和WS_EX_TRANSPARENT样式,表单会正确显示,但CTabView调整大小时,其下面的所有内容都会可怕地闪烁。
我需要更改什么才能消除闪烁并正确绘制控件?
谢谢,保罗
编辑:让它工作。我WS_EX_TRANSPARENT按照马克·兰塞姆的建议删除了所有样式。我只将样式放在(包含在)WS_EX_COMPOSITED上。其他控件根据需要通过 获得双缓冲。CTabCtrlCTabViewWTL::CDoubleBufferImpl<>
我有一个 Visual Studio 2008 C++03 项目,其中有一个声明为_declspec( novtable ). 例如:
class _declspec( novtable ) IFoo
{
public:
virtual void FooDo() const = 0;
};
class Foo : public IFoo
{
public:
~Foo() { printf( "~Foo()\r\n" ); };
void FooDo() const { printf( "FooDo()\r\n" ); };
};
int main( int argc, char* argv[] )
{
IFoo* foo = new Foo();
foo->FooDo();
delete foo;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
因为IFoo没有虚拟析构函数,所以Foo永远不会调用具体析构函数。
输出:
FooDo()
Run Code Online (Sandbox Code Playgroud)
期望输出:
FooDo()
~Foo()
Run Code Online (Sandbox Code Playgroud)
但是,在MSDN 中,对于在声明的接口类中调用函数有一个可怕的警告 …
我有一个Visual Studio 2008 C++ 03项目,其中使用工厂方法基于一组位标志使用大型switch/case语句创建mixin类.
例如:
inline boost::shared_ptr< MyInterface > Create( DWORD flags )
{
int a, b, c;
/* ... */
/*
0x000000 - MixinBase
0x000001 - AddOnA
0x001000 - AddOnB
0x002000 - AddOnC
0x400000 - AddOnD
... several more
*/
switch( flags )
{
case 0x000001:
return boost::make_shared< AddOnA< MixinBase > >( a, b, c );
case 0x001001:
return boost::make_shared< AddOnB< AddOnA< MixinBase > > >( a, b, c );
case 0x003001:
return boost::make_shared< AddOnC< AddOnB< MixinBase > …Run Code Online (Sandbox Code Playgroud) 与C++异常不同,访问冲突表明您的应用程序运行时已被破坏,因此应用程序的状态未定义.在这种情况下最好的办法是退出你的应用程序(通常是因为它崩溃而为你完成).
我注意到可以捕获其中一个例外.例如,在Microsoft Visual C++中,您可以使用/EHa或__try/__catch执行此操作.
那么,你想要抓住它们的原因是什么?据我了解,您的应用程序无法恢复.
我在一些我正在使用的代码中发现了一个问题,我担心这可能是代码库的几个方面的问题.该问题与签名/未签名的比较有关:
unsigned short u16;
short s16;
u16 = 0x8000;
s16 = u16;
if (u16 > s16) {
/* This is what gets printed in GCC */
printf("u16 > s16\n");
} else if (u16 == s16) {
printf("u16 == s16\n");
} else {
printf("u16 < s16\n");
}
Run Code Online (Sandbox Code Playgroud)
我理解为什么这是一个问题.有没有很好的方法可以在您的代码库中可靠地找到这种问题?理想情况下,它会显示为编译器警告或静态代码分析警告,但GCC和Coverity都没有说什么.