小编Ren*_*ert的帖子

pImpl成语是否真的在实践中使用?

我正在阅读Herb Sutter的"Exceptional C++"一书,在那本书中我学到了关于pImpl的习语.基本上,我们的想法是为a的private对象创建一个结构class并动态分配它们以减少编译时间(并且还以更好的方式隐藏私有实现).

例如:

class X
{
private:
  C c;
  D d;  
} ;
Run Code Online (Sandbox Code Playgroud)

可以改为:

class X
{
private:
  struct XImpl;
  XImpl* pImpl;       
};
Run Code Online (Sandbox Code Playgroud)

并且,在CPP中,定义:

struct X::XImpl
{
  C c;
  D d;
};
Run Code Online (Sandbox Code Playgroud)

这看起来很有趣,但我以前从未见过这种方法,既没有在我工作的公司,也没有在我看过源代码的开源项目中.所以,我想知道这种技术真的在实践中使用了吗?

我应该在任何地方使用它,还是谨慎使用?这种技术是否建议用于嵌入式系统(性能非常重要)?

c++ oop pimpl-idiom

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

在")"之后定义函数的参数类型,它是一个非常古老的标准吗?

我正在读一本关于C代码混淆的旧书(该书于1993年出版),我注意到带参数的函数是这样实现的:

real_dump(address, infunc, ofp)
char *address;
int (*infunc)();
FILE *ofp;
{
    /* the code goes here... */
}
Run Code Online (Sandbox Code Playgroud)

此外,没有定义返回类型.

这是旧标准吗?是否可以启用gcc来编译此代码?

c

16
推荐指数
2
解决办法
1910
查看次数

什么是"!!"的用法 (否定两次)?

可能重复:
C++代码中的双重否定

让我们说:

bool var = !!true;
Run Code Online (Sandbox Code Playgroud)

它将为变量赋予"true".似乎没用,但我看的是Visual Studio对"断言"的定义,它是:

#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
Run Code Online (Sandbox Code Playgroud)

为什么它两次否定"_Expression"?

我想知道他们想强迫"!" 要调用的运算符(在它超载的情况下),但这似乎不是一个好理由.

c c++

15
推荐指数
1
解决办法
841
查看次数

可执行文件是否可以请求管理员权限?(Windows 7的)

我正在开发一个分区磁盘程序,让我阅读\\\\.\\PhysicalDrive0我需要管理员权限.

我想知道在运行时是否有可能让程序获得管理员权限?那有什么胜利api吗?

我想这样做,因为我希望程序只有在读取/写入磁盘时才能使用管理员权限执行.出于安全原因,我不希望程序一直使用管理员权限执行,因为有人可能会在某个模块中发现错误(例如堆栈或堆溢出)并执行任意命令作为adm.

c++ winapi windows-7

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

将数组复制到std :: vector中

我正在搜索这个主题,我找到了很多方法将array []转换为std :: vector,就像使用:

assign(a, a + n)
Run Code Online (Sandbox Code Playgroud)

或者,直接在构造函数中:

std::vector<unsigned char> v ( a, a + n );
Run Code Online (Sandbox Code Playgroud)

那些解决了我的问题,但我想知道是否可能(并且正确):

myvet.resize( 10 );
memcpy( &myvet[0], buffer, 10 );
Run Code Online (Sandbox Code Playgroud)

我想知道这是因为我有以下代码:

IDiskAccess::ERetRead nsDisks::DiskAccess::Read( std::vector< uint8_t >& bufferRead, int32_t totalToRead )
{
    uint8_t* data = new uint8_t[totalToRead];
    DWORD totalRead;
    ReadFile( mhFile, data, totalToRead, &totalRead, NULL );
    bufferRead.resize( totalRead );
    bufferRead.assign( data, data + totalRead );
    delete[] data;

    return IDiskAccess::READ_OK;
}
Run Code Online (Sandbox Code Playgroud)

我想这样做:

IDiskAccess::ERetRead nsDisks::DiskAccess::Read( std::vector< uint8_t >& bufferRead, int32_t totalToRead )
{
    bufferRead.resize( totalToRead ); …
Run Code Online (Sandbox Code Playgroud)

c++ vector

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

只允许使用宏调用函数

我在C中开发自己的断言函数,并在我的头文件中声明为:

void Certify_Continuity( const char* expression, const int line, const char* file );
Run Code Online (Sandbox Code Playgroud)

它应该使用定义为的宏来调用:

#if !defined ( ENABLE_DEBUG ) || defined ( __CALLE__ )
#define DEBUG_ASSERT( e ) (void)(e)
#else
#define DEBUG_ASSERT( e ) ( e ) ? (void)0 : Certify_Continuity( #e, __LINE__, __FILE__ )
#endif
Run Code Online (Sandbox Code Playgroud)

这里的问题是程序员可以直接调用Certify_Continuity.

是否有任何技术禁止用户直接调用该函数,只允许他使用宏调用它?

c

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

标签 统计

c++ ×4

c ×3

oop ×1

pimpl-idiom ×1

vector ×1

winapi ×1

windows-7 ×1