我只是想知道,是否可以在类构造时立即创建类的数组成员:
class C
{
public:
C(int a) : i(a) {}
private:
int i;
};
class D
{
public:
D() : a(5, 8) {}
D(int m, int n) : a(m,n) {}
private:
C a[2];
};
Run Code Online (Sandbox Code Playgroud)
就我用Google搜索而言,构造函数中的数组创建(如上所述)在C++中是不可能的.或者,可以在构造函数块中如下初始化阵列成员.
class D
{
public:
D() {
a[0] = 5;
a[1] = 8;
}
D(int m, int n) {
a[0] = m;
a[1] = n;
}
private:
C a[2];
};
Run Code Online (Sandbox Code Playgroud)
但是,它不再是一个数组创建,而是数组赋值.数组元素由编译器通过其默认构造函数自动创建,随后将它们手动分配给C'tor块中的特定值.什么令人讨厌; 对于这样的解决方法,C类必须提供默认的构造函数.
有没有人知道哪些可以帮助我在构建时创建阵列成员.我知道使用std :: vector可能是一个解决方案但是,由于项目条件,我不允许使用任何标准,Boost或第三方库.
new返回的派生类的指针可以类型转换为其基类的指针.
这是对还是错?
我知道dynamic_cast可以用来强制下行.通常,如何将派生类的指针强制转换为其基类的指针?
考虑以下程序:
template <typename T>
struct t
{
struct base { void f1(); };
struct derived : base
{
void f2()
{
f1();
}
};
};
Run Code Online (Sandbox Code Playgroud)
在derived::f2,使用非限定查找来查找f1.会base被搜查?会base::f1被发现?是base一种依赖型?
请使用标准中的引用来证实您的答案.
我在转储中嵌入了一个自定义流(即将UserStreamParam参数传递给MiniDumpWriteDump函数).现在,我正在尝试从WinDbg扩展中提取流.(请注意,我已经验证我可以使用MiniDumpReadDumpStream函数检索流).
我正在使用带有DEBUG_REQUEST_READ_USER_MINIDUMP_STREAM请求的IDebugAdvanced2 :: Request方法.我能够从标准流中检索数据.例如,以下代码段将正确检索misc信息流的内容.
DEBUG_READ_USER_MINIDUMP_STREAM rums = {};
rums.StreamType = MiscInfoStream;
rums.Buffer = &buf;
rums.BufferSize = sizeof buf;
hr = p->Request(DEBUG_REQUEST_READ_USER_MINIDUMP_STREAM,
&rums, sizeof rums, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)
但是,尝试检索我自己的流将导致错误(0x80070570,ERROR_FILE_CORRUPT)和WinDbg输出
Dir entry 11, ??? stream has unknown stream type 6381921
Run Code Online (Sandbox Code Playgroud)
请注意,相同的消息显示为.dumpdebug输出的一部分.
Stream 11: type ??? (6381921), size 00000038, RVA 00033FA9
Dir entry 11, ??? stream has unknown stream type 6381921
Run Code Online (Sandbox Code Playgroud)
问题是什么?如何检索用户流的内容?
请考虑以下示例代码.
#define T(q) L##q
#define A(p) T("x" T(#p))
wchar_t w[] = A(a);
Run Code Online (Sandbox Code Playgroud)
这段代码是否格式良好?有什么价值w?C和C++中的行为是否不同?它在C++ 0x中是不同的吗?
我已经浏览了C++ 03标准,在我看来,代码应该是有效w的L"xa".
A发现调用,其处理产生pp序列T ( "x" T ( "a" ) ).T发现了调用,屈服L ## "x" T ( "a" ),反过来产生L"x" T ( "a" ).T发现了调用,屈服L"x" L"a".那是对的吗?EDG和Clang都没有接受该片段,MSVC 9编译得很好.
我正在尝试编写一个小的内存泄漏检测工具。
我的想法是跟踪应用程序中的动态内存分配寿命,以确定可能导致我的应用程序在使用过程中成为核心的任何无效的内存访问或未删除的内存。
我想编写一个简单的接口来覆盖new和delete。
在我的覆盖下,new我想打印功能行地址等,然后调用标准new。
有没有人尝试过?我不确定我是否可以从班级特定的新运算符中调用标准新。
考虑以下片段。
#define X iostream>
#include <X
Run Code Online (Sandbox Code Playgroud)
在 之后#include,可以构成预处理标记的最长字符序列是<,后面跟着一个标识符。该标识符在预处理期间被替换为iostream>,并且指令在所有替换之后与形式 < h-char-sequence >匹配。因此,该程序应该格式良好。
另一方面,lex.phases指出:
源文件不应以部分预处理标记或部分注释结尾。
据我所知,上面的程序并没有以部分预处理标记结束。然而,脚注指出:
部分预处理标记可能由以多字符标记的第一部分结尾的源文件产生,该多字符标记需要终止字符序列,例如缺少结束符或 的标头名称。
">
这让我很困惑。源文件是否可以以缺少结束符的标头名称>结尾?
看来 msvc 和 gcc 对待代码片段的方式不同。
我在网站上发现了这段代码,似乎作者早已不见了,无论如何,我很难理解实际的交换以及如何发生相反的情况:
void strrev2(char *str)
{
if( str == NULL )
return;
char *end_ptr = &str[strlen(str) - 1];
char temp;
while( end_ptr > str )
{
temp = *str;
*str++ = *end_ptr;
*end_ptr-- = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
让我们说你喂它"测试"这个词
第一次迭代:
*end_ptr = 'g';
temp = 't'
*str = 'g' // is it first assigned and then incremented to point to the next location?
*end_ptr = 't' // is it first assigned and then decremented to point to the previous location?
Run Code Online (Sandbox Code Playgroud)
第二次迭代会发生什么?我很难过,因为我觉得这就行了:
char …Run Code Online (Sandbox Code Playgroud) 假设我有一个基类Person,我公开Teacher从基类继承一个类Person.现在在main函数中我写了这样的东西
// name will be passed to the base class constructor and 17
// is for derived class constructor.
Teacher object(“name”,17) ;
Teacher object1=object; //call to copy constructor
Run Code Online (Sandbox Code Playgroud)
现在我还没有为这两个类编写复制构造函数,当然会调用默认的复制构造函数.Person类的默认复制构造函数将首先调用基类的复制构造函数.
现在问题是假设我只为基类编写复制构造函数,会发生什么,派生类的默认复制构造函数将调用我的书写复制构造函数.
现在假设我为这两个类编写了复制构造函数.现在派生类(即教师)的复制构造函数将调用基类的默认构造函数而不是复制构造函数为什么?
只有派生类的默认复制构造函数可以自动调用基类的复制构造函数吗?
我试图将双精度转换为本机NT应用程序中的字符串,即仅依赖于的应用程序ntdll.dll.不幸的是,ntdll的版本vsnprintf不支持%fet al.,迫使我自己实现转换.
上述ntdll.dll出口只有少数的math.h功能(floor,ceil,log,pow,...).但是,我有理由相信,math.h如果有必要,我可以实现任何不可用的功能.
在GNU的libc中有一个浮点转换的实现,但代码非常密集且难以理解(GNU缩进样式在这里没有帮助).
我已经通过对数字进行归一化来实现转换(即将数字乘以/除以10直到它在间隔中[1, 10)),然后通过modf将小数部分减去10并将小数部分乘以10来生成每个数字.这有效,但是精度损失(只有前15位是正确的).当然,精度的损失是算法固有的.
我会使用17位数字,但是能够正确生成任意数量的数字的算法将是首选.
你能建议一个算法或指向一个好的资源吗?
c++ ×10
c ×3
arrays ×1
c++20 ×1
com ×1
constructor ×1
dbgeng ×1
memory ×1
memory-leaks ×1
new-operator ×1
oop ×1
string ×1
windbg ×1