在此代码中,构造函数被调用两次.
我该如何避免?
如果我取消注释默认构造函数代码块,那么代码不会给出令人满意的输出.
而且我也想要基于条件的模板实例化,所以我使用了void指针.
#include<iostream.h>
template<class Type>
class Data{
public:
Type val;
Data(Type v){
cout<<"In Constructor Param";
val = v;
}
Data(){
// cout<<"In Constructor Defa"; uncommnet this line
}
~Data(){}
};
int main(){
Data<void *> obj;
obj = new Data<float>(31.34f);
cout<<*(float*)obj.val;
}
Run Code Online (Sandbox Code Playgroud)
输出:
In Constructor Param
In Constructor Param
31.34
Run Code Online (Sandbox Code Playgroud)
谢谢你的参与.
我正在寻找一个存储字符串的数据结构.我需要一个接口中的函数,它接受一个字符串作为唯一参数,并返回一个引用/迭代器/指针/句柄,可用于检索其余字符串的字符串.数据结构的生命周期.不需要设置成员资格,条目删除等.
我更关心内存使用而不是速度.
我正在学习C++,无法理解这个问题:
我有一个简单的A类
class A {
private:
int ival;
float fval;
public:
A(int i = 0, float f = 0.0) : ival(i), fval(f) { }
~A(){ }
void show() const {
cout << ival << " : " << fval << "\n";
}
void setVal(int i) {
ival = i;
}
//const getters for both ival and fval
//used for the default "lesser"
friend bool operator<(const A& val1, const A& val2) {
return val1.ival < val2.ival ? true : false;;
} …Run Code Online (Sandbox Code Playgroud) __forceinline static int Random()
{
int x = 214013, y = 2531011;
seed = (x * seed + y);
return ((seed >> 16) & 0x7FFF) - 0x3FFF;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码返回PRNG,具有良好的均匀分布.
现在将x更改为x + 1 - 结果序列不能再被称为PRNG.
那么(这个)PRNG背后的理论是什么?"x和y是经过精心挑选的",但它们是如何被选中的?
class Base
{
public:
Base(){}
Base(int k):a(k)
{
}
int a;
};
class X:virtual public Base
{
public:
X():Base(10){}
int x;
};
class Y:virtual public Base
{
public:
Y():Base(10){}
int y;
};
class Z:public X,public Y
{
public:
Z():X(10){}
};
int main()
{
Z a;
cout << a.a;
return 1;
}
Run Code Online (Sandbox Code Playgroud)
在上述情况下,Z():X(10){} Base(int k):a(k)不打电话,但是当我改变Z():Base(10){}了Base(int k):a(k)被调用.为什么?
谢谢.
这是一个相当小的问题,但它让我烦恼:IntelliSense似乎确信在条件中声明函数范围内的静态变量if是一个错误,并抱怨它.只有它构建得很好,甚至MSDN文档都将其视为合法用法.我真的想摆脱波浪般的红线,因为它经常出现(它在我经常使用的宏中使用).
这是代码,作为一个例子,虽然它不是我的程序中唯一的例子:
MyForm::MyForm()
{
_VMESSAGE("Constructing '%s'/%p:%p @ <%p>",GetEditorID(),GetFormType(),formID,this);
if (static bool runonce = true)
{
// patch up vtbl
memaddr thisvtbl = (UInt32)memaddr::GetObjectVtbl(this);
_MESSAGE("Patching MyForm Form vtbl @ <%p>",thisvtbl);
gLog.Indent();
for (int i = 0; i < sizeof(Form_NoUseMethods)*0x8; i++)
{
if ((Form_NoUseMethods[i/0x20] >> (i%0x20)) & 1)
{
thisvtbl.SetVtblEntry(i*4,TESForm_vtbl.GetVtblEntry(i*4));
_VMESSAGE("Patched Offset 0x%04X",i*4);
}
}
gLog.Outdent();
runonce = false;
}
}
Run Code Online (Sandbox Code Playgroud)
无论是static在if ( static bool runonce = true )线路和的每次使用_MESSAGE或_VMESSAGE(它使用了类似的构建体)是由智能感知下划线,和鼠标悬停在任何读取"错误:存储类可能不会在这里指定" 构建项目不会产生与这些线路相关的错误.
int arr[5] = {0,1,2,3,4};
vector<int> vec;
Run Code Online (Sandbox Code Playgroud)
通常我们这样做:
vector<int> vec(arr, arr + sizeof(arr) / sizeof(int));
Run Code Online (Sandbox Code Playgroud)
但是如何仅使用arr的前3个值初始化矢量vec?另外我如何用中间3值初始化它?
我必须马上初始化它,不要push_back多行...
可能它是C程序员最简单的事情之一,但我真的无法得到它.
unsigned char Value[4];
unsigned long ulVer = 00010001;
unsigned long uSize = sizeof(ulVer);
memcpy(Value, &ulVer, uSize);
memcpy(&ulVer, Value, uSize);
printf("%d",ulVer);
Run Code Online (Sandbox Code Playgroud)
为什么ulVer是4097而不是10001?
该代码应该与.txt和_r.txt连接argv [1].
std::stringstream sstm;
std::stringstream sstm_r;
sstm<<argv[1]<<".txt";
sstm_r<<argv[1]<<"_r.txt";
const char* result = sstm.str().c_str();
const char* result_r = sstm_r.str().c_str();
fs.open(result);
fs_r.open(result_r);
cout<<result<<endl;
cout<<result_r<<endl;
Run Code Online (Sandbox Code Playgroud)
但它的作用是,当我输入"abc"作为argv [1]时,它给了我,结果为"abc_r.tx0",result_r也是"abc_r.tx0".这是怎样的正确方法,为什么是这个错了.