我和一位同事讨论过,他坚持认为在Java和C#这样的语言中,没有任何理由使用Pure Abstract基类,因为它只是意味着你无法避免缺少多重继承.
我觉得他错了,因为我一直以为如果一个东西是名词那么它就是一个对象,如果它是一个动词那么它就是一个界面.
例如,如果我想定义类型Bird,我想在fly不实现它的情况下强制执行该方法,那么我将使它成为一个纯抽象类.
如果我想定义一个类型Flies,我会把它作为该方法的接口fly.
Bird可能会实施Flies.
我错了吗?
编辑:
我能给予支持我观点的唯一可靠论点是,在未来的某个时刻,设计可能需要改变,以便鸟类可以吃.如果所有的鸟都吃同样的东西,那么就需要添加Bird它,使它成为非纯抽象的.
如果Bird是一个接口,这个改变只会是一场噩梦,因为我不知道从其他基类继承的东西是否也实现了我的Bird接口,所以我不能只重构我的问题.
例如,我有一些pet_maker()创建并返回a Cat或a Dog作为基础的函数Pet.我想多次调用这个函数,并对Pet返回的函数做一些事情.
传统上我new的Cat还是Dog在pet_maker()和返回一个指向它,但是new通话比在栈上所做的一切要慢得多.
是否有一种简洁的方式,任何人都可以想到作为抽象返回,而不必每次调用函数时都做新的,或者是否有其他方法可以快速创建和返回抽象?
在下面的示例中,我希望在编译时被告知,从 long 到 int 的转换会更改值,就像我不使用用户定义的文字时所做的那样。
#include <cassert>
constexpr int operator "" _asInt(unsigned long long i) {
// How do I ensure that i fits in an int here?
// assert(i < std::numeric_limits<int>::max()); // i is not constexpr
return static_cast<int>(i);
}
int main() {
int a = 1_asInt;
int b = 99999999999999999_asInt; // I'd like a warning or error here
int c = 99999999999999999; // The compiler will warn me here that this isn't safe
}
Run Code Online (Sandbox Code Playgroud)
我可以找出几种获得运行时错误的方法,但我希望有某种方法可以使其成为编译时错误,因为据我所知,所有元素都可以在编译时已知。
我原以为这个静态断言会被激发:
#include <type_traits>
#include <memory>
int main() {
static_assert(std::is_copy_constructible<std::unique_ptr<int>>::value, "UPtr has copy constructor?");
}
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.
使用MSVC12编译:
用于x64的Microsoft(R)C/C++优化编译器版本18.00.31101
可能重复:
成员字段,构造顺序
如果我有一个有两个成员的班级,如下:
class A
{
int a;
int b;
A() {}
};
Run Code Online (Sandbox Code Playgroud)
是为了在a和b构造不确定?
如果我使用cl,那么无论我调用构造函数的顺序如何,成员总是按照它们在类中声明的顺序构造.在这种情况下,它会永远a那么b,即使我定义的构造方法A,如:
A() : b(), a() {}
Run Code Online (Sandbox Code Playgroud)
但我假设这只是特定编译器的行为.
我正在尝试编写一个简单的perl脚本来将一个给定的正则表达式应用于文件名等,并且我无法将正则表达式作为参数传递给脚本.
我希望能做的是这样的事情:
> myscript 's/hi/bye/i' hi.h
bye.h
>
Run Code Online (Sandbox Code Playgroud)
我已经制作了这段代码
#!/utils/bin/perl -w
use strict;
use warnings;
my $n_args = $#ARGV + 1;
my $regex = $ARGV[0];
for(my $i=1; $i<$n_args; $i++) {
my $file = $ARGV[$i];
$file =~ $regex;
print "OUTPUT: $file\n";
}
Run Code Online (Sandbox Code Playgroud)
我不能使用qr,因为显然它不能用于替换正则表达式(虽然我的来源是一个论坛帖子所以我很高兴被证明是错误的).
我宁愿避免将这两个部分作为单独的字符串传递并在perl脚本中手动执行正则表达式.
是否有可能将正则表达式作为这样的参数传递,如果是这样,最好的方法是什么?
可能重复:
变量列表中的逗号是序列点吗?
如果我有以下代码,逗号是一个正常的序列点,还是行为未定义?
int i = 1, j = i;
Run Code Online (Sandbox Code Playgroud)
我实际上并不打算使用这个(我们的内部标准甚至禁止int i, j),但我很好奇,它对谷歌来说很奇怪.
我正在尝试调试一些Tree View代码,我想检查HTREEITEM返回的CTreeCtrl.InsertItem是否在内存中有效.
但是我找不到任何HTREEITEM我经常检查的地方的文件(谷歌,MSDN,同事),只有很多人问同样的问题.
你知道什么HTREEITEM是定义吗?你知道任何有关细节内部结构的好链接HTREEITEM吗?
我在C++工作,但C引用也会有所帮助.