我正在阅读Scott Meyers撰写的Effective C ++第三版。
他说,一般来讲,从不包含虚函数的类中继承不是一个好主意,因为如果您以某种方式将派生类的指针转换为基类的指针,然后再将delete其转换,则可能会出现不确定的行为。
这是他给出的(人为)示例:
class SpecialString: public std::string{
// ...
}
SpecialString *pss = new SpecialString("Impending Doom");
std::string *ps;
ps = pss;
delete ps; // undefined! SpecialString destructor won't be called
Run Code Online (Sandbox Code Playgroud)
我理解为什么这会导致错误,但是在SpecialString类内部没有什么可以阻止类似ps = pss事件的发生?
Meyers指出(在本书的另一部分中),显式防止类中允许某些行为的常见技术是声明特定的函数,但有意不对其进行定义。他给出的例子是复制构造。例如,对于您不想允许复制构造的类,声明一个私有复制构造函数但不定义它,因此,任何使用它的尝试都会导致编译时错误。
我意识到ps = pss在此示例中不是复制构造,只是想知道是否可以在此处进行任何操作以明确防止这种情况发生(除了“只是不这样做”的答案外)。
如果范围内的数据A1:A4如下:
Apple
Banana
Orange
Strawberry
Run Code Online (Sandbox Code Playgroud)
然后INDEX可以用于单独返回该列表中的任何值,例如
= INDEX(A1:A4,3)
Run Code Online (Sandbox Code Playgroud)
会回来Orange.
是否有类似的Excel函数或函数组合,可以有效地允许您执行以下操作:
= INDEX(A1:A4,{2;3})
Run Code Online (Sandbox Code Playgroud)
哪个会返回一个数组{Banana;Orange}?
这是可能的(最好没有VBA),如果是这样,怎么样?即使使用辅助细胞,我也很难弄清楚如何实现这一目标.
如果数据是数字(使用MMULT),我可以找出一个有点复杂的解决方案,但数据是文本这一事实让我感到沮丧,因为MMULT它不适用于文本.
我的情况的简化示例:
我有一个有3个成员变量的类,所有整数,例如
class Foo
{
public:
int A;
int B;
int C;
};
Run Code Online (Sandbox Code Playgroud)
我希望有一个函数,true如果所有成员变量都是0,false则返回一个布尔值,否则.
很容易,可以用这个成员函数完成:
bool all_zero()
{
return (A == 0 && B == 0 && C == 0);
}
Run Code Online (Sandbox Code Playgroud)
如有必要,我可以这样做.
但是,这在我的情况下并不理想,因为:
我不是唯一管理这个软件的人.
有时,会将新成员变量添加到此类(例如int D).
这是一个非常大的C++项目,我们通常不会通过手动修改代码直接向类添加新的成员变量 - 相反,我们有自动修改代码的自定义工具.因此,我们很少对这个类进行手动修改.
另外,由于这个项目太大,all_zero上面的功能很容易被忽略(即&& D == 0如果添加了新的成员变量,有人可能会忘记或完全不知道添加到函数中).
所有这些......这是我的问题:
有没有办法修改这个all_zero函数,以便它总是检查所有成员变量(int类型),而不需要告诉函数显式检查每个?顺便说一句,如果这个功能是在类之外完成的(而不是在带有成员函数的类中),我也可以.
我希望我不必诉诸于此,但对我来说最糟糕的情况是我可以坚持all_zero上面的这个原始想法,只是程序化添加一个新的成员变量到这个类,基本上告诉任何添加的人该类的成员变量也必须手动修改此all_zero函数.
我经常发现自己编写的 Excel 公式中包含以下内容:
= IF(<long expression>=<some condition>,<long expression>,0)
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以实现这一点,而无需输入<long expression>两次(也不使用辅助单元)?
理想情况下,其工作原理类似于IFERROR,即
= IFERROR(<some expression>,0)
Run Code Online (Sandbox Code Playgroud)
这会检查是否<some expression>会返回任何类型的错误,如果不会,则会自动返回<some expression>(无需再次显式输入)。
是否有类似的 Excel 函数(或 Excel 函数的组合),IFERROR但它不是检查错误条件,而是根据公式检查一般(用户定义)条件?
如果我的单元格范围内有数据A1:A6:
Apple
Banana
Cherry
Grape
Orange
Watermelon
Run Code Online (Sandbox Code Playgroud)
有没有办法返回一个数组(在单个单元格中,用于较大公式的中间步骤),该数组返回上述数组,除了那些满足特定条件的条目之外?
例如,如果我想要一个公式返回仅包含包含字母 的单元格的数组n,它将返回:
Banana
Orange
Watermelon
Run Code Online (Sandbox Code Playgroud)
有办法做到这一点吗?
注意我不想返回相同大小的数组,只有空白条目,即我不想:
""
Banana
""
""
Orange
Watermelon
Run Code Online (Sandbox Code Playgroud) 类的实例称为对象,但结构的实例是否有某个名称?
使用单独的术语"类"和"对象"有助于区分类和类的实例,但我只听说过单个术语"struct"来引用结构或实例. struct(取决于上下文).
我正在尝试创建一个公式,该公式返回两个不同长度的数组的串联。我需要将此串联用于另一个公式的一部分,如果可能的话,我希望避免使用“帮助”行。
参见下面的示例数据。
目的是使输出为{10;11;12;13;20;21;22}。当然,可以很容易地将其硬编码到公式中,但是这些值是动态的,因此不是一种选择。
我尝试了以下方法:
{A1:A4;B1:B3}
Run Code Online (Sandbox Code Playgroud)
但这显然不是有效的Excel语法。
有解决方案吗?
我在一家使用大型C++项目来自动化制造过程的公司工作,在查看C++源代码的修订历史时,我注意到了以下特殊行为.
下面显示了软件的不同版本中此行为的简化示例.
软件修订版1:
struct Foo
{
int x;
int reserve[20]; // unused
};
Run Code Online (Sandbox Code Playgroud)
软件修订版2:
struct Foo
{
int x;
int y[2];
int reserve[18]; // unused
};
Run Code Online (Sandbox Code Playgroud)
软件修订版3:
struct Foo
{
int x;
int y[2];
int z[5];
int reserve[13]; // unused
};
Run Code Online (Sandbox Code Playgroud)
很明显,未使用的reserve数组就是为了确保创建的结构的任何实例总是占用相同数量的内存,而不管软件的哪个版本正在运行.
我的问题是:对于大型C++项目,这是常见的做法和/或良好做法吗?是否有任何一般性(一般意义,非特定应用)原因使用这种做法是必需的还是有利的?
我理解如何使用每种方法:( VLOOKUP或HLOOKUP)vs . INDEX/ MATCH.
我在寻找他们之间的差异,而不是在个人偏好方面,但主要是在以下方面:
是否有一种方法可以做到另一种方法无法做到的事情?
哪一个更有效(或者取决于具体情况)?
使用一种方法与另一种方法的任何其他优点/缺点
注意:我在这里回答我自己的问题,但是想看看是否有其他人有其他我没有想过的见解.
是否可以在不使用 VBA 且不使用任何“帮助”表或行/列的情况下在 Excel 中生成排列表?
对于 N 列,将有 N! 行。
例如,N=3 的表将如下所示:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
Run Code Online (Sandbox Code Playgroud) 我一直在阅读有关C++指针的各种问题和答案,但我仍然从根本上不理解某些东西.
我已经读过,指针允许动态内存分配,实际上没有删除对象,直到明确告知这样做.我理解这一点,但我不明白的是,在指针范围结束后,堆上的对象是如何被再次引用的.
见下面的代码.
{
myClass* x = new myClass();
}
// How to access the object that x points to here?
Run Code Online (Sandbox Code Playgroud)
我知道在范围的末尾,x(指针本身)不再存在,但是对象(指针指向的对象)仍然存在于堆上.
我的问题是:如果指向内存中该地址的指针不再存在,那么内存中的地址如何再次被访问?
似乎使用Excel功能INDIRECT(ADDRESS(...)),OFFSET(...)可以互换使用.
例如,以下两个公式将相同的结果返回到绝对引用:
= INDIRECT(ADDRESS(1,1))
= OFFSET(<current cell>,1-ROW(),1-COLUMN())
Run Code Online (Sandbox Code Playgroud)
类似地,接下来的两个公式将相同的结果返回给相对引用(在这种情况下,例如,这些公式返回该公式下单元格中的公式值):
= OFFSET(<current cell>,1,0)
= INDIRECT(ADDRESS(ROW()+1,COLUMN()))
Run Code Online (Sandbox Code Playgroud)
我的问题是:一种方法总是优先于另一种吗?在我看来,它INDIRECT(ADDRESS(...))适用于更多绝对类型引用,并OFFSET(...)适用于更多相对类型引用,但如上所示,任何一种方法都可用于完成任一类型的引用.或者,使用这两种优于这两种选项的功能是否有完全不同的替代方案?