【发布时间】:2025-12-11 10:15:02
【问题描述】:
在第二个扩展类中,当调用方法时,字段的克隆值正在发生变化。
上市:
#include<iostream>
using namespace std;
class Set
{
public:
Set(int min,int max)
{
num_bits=max-min+1;
num_bytes=(num_bits+7)/8;
elems=new int8_t[num_bytes];
for(int i=0; i<num_bytes; i++)elems[i]=0;
minElem=min;
maxElem=max;
};
void add(int n)
{
int bit=n-minElem;
elems[bit/8]|=(1<<(bit%8));
};
void del(int n)
{
int bit=n-minElem;
elems[bit/8]&=~(1<<(bit%8));
};
bool has(int n)
{
int bit=n-minElem;
return(elems[bit/8]&(1<<(bit%8)));
}
void print()//str
{
int i=0;
do
{
cout<<(has(i+minElem)?"1":"0");
i++;
if(i%8==0)cout<<" ";
}
while(i<num_bits);
}
~Set()
{
delete[] elems;
};
public://rotected
int num_bits,num_bytes,minElem,maxElem;
int8_t *elems;
};
class ExSet:public Set{
public:
ExSet(int min,int max):Set(min,max){}
ExSet(Set s):Set(s.minElem,s.maxElem){/*clone(s);*/}
void clone(Set s){
//for(int i=0;i<num_bytes;i++){int x=s.elems[i];cout<<elems[i]<<'='<<s.elems[i]<<'/';}
};
};
main()
{
char *p="ABCZabxyz";
Set s('A','z');
do s.add(*p);
while(*++p!='\0');
s.del('B');
s.print();
cout<<endl;
for(char c='A'; c<='z'; c++)if(s.has(c))cout<<c;
cout<<endl;
//delete &s;
ExSet es(s);
for(char c='A'; c<='z'; c++)if(s.has(c))cout<<c;
};
预期:
10100000 00000000 00000000 01000000 11000000 00000000 00000001 11
ACZabxyz
ACZabxyz
获取:
10100000 00000000 00000000 01000000 11000000 00000000 00000001 11
ACZabxyz
FGINQRVWghqrvw
【问题讨论】:
-
阅读Rule of Three,并通过引用传递复杂对象,除非您特别想复制它们。
-
这是正确的详细信息:
创建子 ExSet es(s) 时;字段的值正在改变。如果我切断 I//ExSet es(s);我看到了预期。
无法编辑我的帖子,编辑要求更多细节不可阻挡((
标签: c++ class inheritance superclass