小编sji*_*sji的帖子

纯抽象类和接口之间的区别

我和一位同事讨论过,他坚持认为在Java和C#这样的语言中,没有任何理由使用Pure Abstract基类,因为它只是意味着你无法避免缺少多重继承.

我觉得他错了,因为我一直以为如果一个东西是名词那么它就是一个对象,如果它是一个动词那么它就是一个界面.

例如,如果我想定义类型Bird,我想在fly不实现它的情况下强制执行该方法,那么我将使它成为一个纯抽象类.

如果我想定义一个类型Flies,我会把它作为该方法的接口fly.

Bird可能会实施Flies.

我错了吗?

编辑:

我能给予支持我观点的唯一可靠论点是,在未来的某个时刻,设计可能需要改变,以便鸟类可以吃.如果所有的鸟都吃同样的东西,那么就需要添加Bird它,使它成为非纯抽象的.

如果Bird是一个接口,这个改变只会是一场噩梦,因为我不知道从其他基类继承的东西是否也实现了我的Bird接口,所以我不能只重构我的问题.

c# java oop

25
推荐指数
2
解决办法
6218
查看次数

有没有办法在不使用new的情况下从函数返回抽象(出于性能原因)

例如,我有一些pet_maker()创建并返回a Cat或a Dog作为基础的函数Pet.我想多次调用这个函数,并对Pet返回的函数做一些事情.

传统上我newCat还是Dogpet_maker()和返回一个指向它,但是new通话比在栈上所做的一切要慢得多.

是否有一种简洁的方式,任何人都可以想到作为抽象返回,而不必每次调用函数时都做新的,或者是否有其他方法可以快速创建和返回抽象?

c++ oop

23
推荐指数
4
解决办法
2414
查看次数

是否可以在编译时验证用户定义文字的输入

在下面的示例中,我希望在编译时被告知,从 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)

我可以找出几种获得运行时错误的方法,但我希望有某种方法可以使其成为编译时错误,因为据我所知,所有元素都可以在编译时已知。

c++ compile-time

17
推荐指数
1
解决办法
835
查看次数

为什么is_copy_constructible在MSVC12中对unique_ptr返回true

我原以为这个静态断言会被激发:

#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

c++ type-traits c++11 msvc12

11
推荐指数
1
解决办法
481
查看次数

在c ++中是否未定义类的成员变量的构造顺序?

可能重复:
成员字段,构造顺序

如果我有一个有两个成员的班级,如下:

class A
{
    int a;
    int b;
    A() {}
};
Run Code Online (Sandbox Code Playgroud)

为了ab构造不确定

如果我使用cl,那么无论我调用构造函数的顺序如何,成员总是按照它们在类中声明的顺序构造.在这种情况下,它会永远a那么b,即使我定义的构造方法A,如:

A() : b(), a() {}
Run Code Online (Sandbox Code Playgroud)

但我假设这只是特定编译器的行为.

c++

4
推荐指数
1
解决办法
162
查看次数

如何将替换正则表达式作为命令行参数传递给perl脚本

我正在尝试编写一个简单的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脚本中手动执行正则表达式.

是否有可能将正则表达式作为这样的参数传递,如果是这样,最好的方法是什么?

regex perl

4
推荐指数
1
解决办法
3960
查看次数

初始化变量列表中的赋值顺序是否未定义?

可能重复:
变量列表中的逗号是序列点吗?

如果我有以下代码,逗号是一个正常的序列点,还是行为未定义?

int i = 1, j = i;
Run Code Online (Sandbox Code Playgroud)

我实际上并不打算使用这个(我们的内部标准甚至禁止int i, j),但我很好奇,它对谷歌来说很奇怪.

c++ operator-precedence

4
推荐指数
1
解决办法
115
查看次数

什么是HTREEITEM?

我正在尝试调试一些Tree View代码,我想检查HTREEITEM返回的CTreeCtrl.InsertItem是否在内存中有效.

但是我找不到任何HTREEITEM我经常检查的地方的文件(谷歌,MSDN,同事),只有很多人问同样的问题.

你知道什么HTREEITEM是定义吗?你知道任何有关细节内部结构的好链接HTREEITEM吗?

我在C++工作,但C引用也会有所帮助.

c++ mfc

2
推荐指数
1
解决办法
8694
查看次数

标签 统计

c++ ×6

oop ×2

c# ×1

c++11 ×1

compile-time ×1

java ×1

mfc ×1

msvc12 ×1

operator-precedence ×1

perl ×1

regex ×1

type-traits ×1