- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在一个项目中使用了两个类。一个类 Callback
负责保存来自回调的信息。另一个类 UserInfo
是向用户公开的信息。基本上,UserInfo
应该是一个非常薄的包装器,它读取 Callback
数据并将其提供给用户,同时还提供一些额外的东西。
struct Callback {
int i;
float f;
};
struct UserInfo {
int i;
float f;
std::string thekicker;
void print();
UserInfo& operator=(const Callback&);
};
问题是向 Callback
添加成员需要对 UserInfo
进行相同的更改,以及更新 operator=
和类似的依赖成员函数。为了让它们自动同步,我想这样做:
struct Callback {
int i;
float f;
};
struct UserInfo : Callback{
std::string thekicker;
void print();
UserInfo& operator=(const Callback&);
};
现在 UserInfo
保证拥有与 Callback
相同的所有数据成员。事实上,踢球者是数据成员thekicker
。 Callback
中没有声明虚拟析构函数,我相信其他编码人员希望它保持这种状态(他们强烈反对虚拟析构函数的性能损失)。但是,如果 UserInfo
类型通过 Callback*
销毁,thekicker
将被泄露。应该注意的是,UserInfo
并非旨在通过 Callback*
接口(interface)使用,因此这些类首先是分开的。另一方面,为了修改一个结构而不得不以相同的方式更改三段或更多代码让人感觉不雅且容易出错。
问题:有没有办法让UserInfo
公开继承Callback
(用户必须能够访问所有相同的信息) 但不允许将 Callback
引用分配给 UserInfo
是因为缺少虚拟析构函数吗?我怀疑这是不可能的,因为它首先是继承的基本目的。我的第二个问题,有没有办法通过其他方法使这两个类彼此同步?我想让 Callback
成为 UserInfo
的成员而不是父类,但我希望数据成员直接用 user.i
读取user.call.i
的。
我想我问的是不可能的事情,但我一直对 stackoverflow 答案的魔力感到惊讶,所以我想我只是问问是否真的有补救办法。
最佳答案
您始终可以通过在基类中保护析构函数来强制执行您提到的“无法通过基类指针删除”约束(在某种程度上):
即
// Not deletable unless a derived class or friend is calling the dtor.
struct Callback {
int i;
float f;
protected:
~Callback() {}
};
// can delete objects of this type:
struct SimpleCallback : public Callback {};
struct UserInfo : public Callback {
std::string thekicker;
// ...
};
正如其他人提到的,您可以删除赋值运算符。对于 c++11 之前的版本,只需将该函数的未实现原型(prototype)设为私有(private)即可:
private:
UserInfo& operator=(const Callback&);
关于c++ - 没有虚拟析构函数的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27908128/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!