小编ala*_*ere的帖子

哈希集的浅拷贝

这是最好的方式吗?

var set2 = new HashSet<reference_type>();
Run Code Online (Sandbox Code Playgroud)

用这样的foreach遍历集合.

foreach (var n in set)
    set2.Add(n);
Run Code Online (Sandbox Code Playgroud)

或者像这样使用像union这样的东西.

set2 = set.UnionWith(set); // all the elements
Run Code Online (Sandbox Code Playgroud)

c# collections union traversal shallow-copy

24
推荐指数
3
解决办法
1万
查看次数

在不存在的结构布局中循环

这是我的一些代码的简化版本:

public struct info
{
    public float a, b;
    public info? c;

    public info(float a, float b, info? c = null)
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是Struct member 'info' causes a cycle in the struct layout.我在结构之后的错误,就像值类型行为一样.我可以使用类和克隆成员函数来模拟这个,但我不明白为什么我需要.

这个错误怎么样?在某些类似的情况下,递归可能会永远导致构造,但在这种情况下我无法想到它的任何方式.下面是程序编译时应该没问题的例子.

new info(1, 2);
new info(1, 2, null);
new info(1, 2, new info(3, 4));
Run Code Online (Sandbox Code Playgroud)

编辑:

我使用的解决方案是使"info"成为一个类而不是一个struct,并给它一个成员函数来返回我在传递它时使用的副本.实际上模拟与结构相同但具有类的行为.

我在寻找答案时也创建了以下问题.

C#中的值类型类定义?

c# constructor struct member cyclic-reference

21
推荐指数
3
解决办法
7107
查看次数

c#多任务

int a, b, n;
...
(a, b) = (2, 3);
// 'a' is now 2 and 'b' is now 3
Run Code Online (Sandbox Code Playgroud)

这种事情在C#中真的很有帮助.在这个例子中,'a'和'b'没有被封装在一起,例如位置的X和Y可能是.这是否以某种形式存在?

下面是一个不太重要的例子.

(a, b) = n == 4 ? (2, 3) : (3, n % 2 == 0 ? 1 : 2);
Run Code Online (Sandbox Code Playgroud)

Adam Maras在评论中表示:

var result = n == 4 ? Tuple.Create(2, 3) : Tuple.Create(3, n % 2 == 0 ? 1 : 2);
Run Code Online (Sandbox Code Playgroud)

然而,当他指出它创建一个新的三元组而不是更改指定的值时,上述示例的工作类型.

Eric Lippert要求用例,因此可能:

(a, b, c) = (c, a, b); // swap or reorder on one …
Run Code Online (Sandbox Code Playgroud)

.net c# tuples variable-assignment

16
推荐指数
2
解决办法
5599
查看次数

委托会员超过经典功能有哪些优点或缺点?

class my_class
{
    public int add_1(int a, int b) {return a + b;}
    public func<int, int, int> add_2 = (a, b) => {return a + b;}
}
Run Code Online (Sandbox Code Playgroud)

add_1是一个函数,而add_2是一个委托.然而,在这种情况下,代表们可以填补类似的角色.

由于先例和语言的设计,C#方法的默认选择应该是函数.

然而,这两种方法都有利有弊,所以我已经制作了一份清单.这两种方法都有任何优点或缺点吗?

传统方法的优点.

  • 更常规
  • 函数的外部用户看到命名参数 - 对于add_2语法arg_n和类型一般不够信息.
  • 使用intellisense-ty Minitech可以更好地工作
  • 适用于反射 - ty Minitech
  • 与继承合作 - Eric Lippert
  • 有一个"这个" - ty CodeInChaos
  • 更低的开销,速度和内存 - ty Minitech和CodeInChaos
  • 在更改和使用函数方面,不需要考虑public\private. - ty CodeInChaos
  • 动态性较低,允许在编译时不知道的少 - ty CodeInChaos

"委托类型字段"方法的优点.

  • 更一致,而不是成员函数和数据成员,它只是数据成员.
  • 可以向外看,表现得像变量.
  • 将它存放在容器中效果很好.
  • 多个类可以使用相同的函数,就好像它是每个成员函数一样,这将非常通用,简洁并且具有良好的代码重用.
  • 直接在任何地方使用,例如作为本地功能.
  • 可能在垃圾收集传递时效果很好.
  • 更动态,在编译时必须知道的更少,例如,可能存在在运行时配置对象行为的函数.
  • 就像封装它的代码一样,可以组合并重新编写,msdn.microsoft.com/en-us/library/ms173175%28v = vs.80%29.aspx
  • 该函数的外部用户可以看到未命名的参数 - 有时这是有用的,尽管能够命名它们会很好.
  • 可以更紧凑,在这个简单的例子中,例如可以删除返回,如果有一个参数,也可以删除括号.
  • 滚动你自己的行为,如继承 - ty …

c# delegates abstraction class function

14
推荐指数
1
解决办法
5526
查看次数

使用Qt Creator C++ 11,nullptr是关键的?

我正在使用Qt Creator使用C++ 11.

"warning: identifier 'nullptr' is a keyword in C++11 [-Wc++0x-compat]"
"error: 'nullptr' was not declared in this scope"
Run Code Online (Sandbox Code Playgroud)

这是在其他地方工作的代码,相关部分是:

... = nullptr;
Run Code Online (Sandbox Code Playgroud)

可能是什么问题?

这不是一个关键字,它的范围不是全球性的吗?

c++ qt-creator nullptr c++11

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

c ++将基类强制转换为派生类

如果我要创建一个名为基类base和派生类叫derived_1,derived_2等...我用的是基类的实例的集合,然后当我取回的元素,并尝试使用它,我会发现C++认为它的类型是基类的,可能是因为我从一个基类中检索到它std::vector.当我想使用仅存在于特定派生类的特征时,这是一个问题,我知道这个对象是我将它放入向量时的类型.

所以我将元素转换为它应该是的类型,并发现这不起作用.

(derived_3)obj_to_be_fixed;
Run Code Online (Sandbox Code Playgroud)

并记得这是一个指针的事情.经过一些调整后,现在已经奏效了.

*((derived_3*)&obj_to_be_fixed);
Run Code Online (Sandbox Code Playgroud)

这是正确的,还是有一个abc_cast()功能可以减少混乱?

编辑:

我不得不把它扩展到另一个问题,那里展示了完整的解决方案.stackoverflow.com ... why-the-polymorphic-types-error-and-cleanup-question

c++ casting class base-class derived-class

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

C#使用其他代码

我从这里下载了一个C#区间树集合类类http://intervaltree.codeplex.com/SourceControl/list/changesets - >右侧 - >下载.

但是我无法在我的Microsoft Visual C#2010 Express(也运行C#XNA)上打开整个项目,因为

此版本的应用程序不支持解决方案文件夹

另外,我只想在我自己的seprate项目中单独使用该类.

我试图复制三个重要的看似文件Interval.cs,IntervalNode.csIntervalTree.cs进入我的项目,但这产生了编译错误

没有导入器可以处理此文件类型

我还尝试将三个文件的内容复制并粘贴到我的项目中,将它们封装到自己的命名空间中,并且有很多代码.我不得不稍微重新安排一些使用,但遇到了可能需要PowerCollections .dll和.pcb文件作为using Wintellect.PowerCollections;原因的问题

找不到类型或命名空间名称'Wintellect'(您是否缺少using指令或程序集引用?)

我不知道如何继续,或者如果我正在做正确的事情,如何让这个班级工作.

c# class interval-tree

9
推荐指数
1
解决办法
3174
查看次数

是否有像图表这样的树的名称,其中节点可以有多个父节点,但仍然只有1级以上

是否有像图表这样的树的名称,其中节点可以有多个父节点,但仍然只有1级以上.

因此,该图是有向的和非循环的,但它也有其他约束.

这也意味着,从任何特定节点返回到根的所有路径都是相同的长度.

tree terminology graph directed-acyclic-graphs

9
推荐指数
1
解决办法
442
查看次数

我可以判断一个std :: string是否使用stringstream表示一个数字?

显然,这可以用于显示字符串是否为数字,例如"12.5"== yes,"abc"== no.但是我得到了一个没有注意的输入.

std::stringstream ss("2");
double d; ss >> d;
if(ss.good()) {std::cout<<"number"<<std::endl;}
else {std::cout<<"other"<<std::endl;}
Run Code Online (Sandbox Code Playgroud)

c++ numbers words stringstream

8
推荐指数
3
解决办法
8566
查看次数

向前声明继承信息

编译很好,虽然我不想尝试运行它.但是......

//class base;
//class derived;
//class derived : public base;

class base {};
class derived : public base {};

class other
{
    public:
        void func() {base1 = derived1;}
        base* base1;
        derived* derived1;
};

void main()
{
}
Run Code Online (Sandbox Code Playgroud)

...将其他类移到base的定义之上并派生出来,我必须在myne程序中执行类似的操作会导致编译错误.

显而易见的解决方案是转发声明base和派生显示在代码顶部注释掉,但这会导致无法在base*和derived*error之间进行转换.尝试转发声明包括继承信息也不起作用.

c++ derived base forward-declaration

6
推荐指数
1
解决办法
4821
查看次数