小编Dun*_*ter的帖子

以允许响应更新的方式重载C++索引下标operator []

考虑编写可索引类的任务,该类自动将其状态与某些外部数据存储(例如文件)同步.为了做到这一点,需要让类知道可能发生的索引值的更改.不幸的是,重载operator []的常用方法不允许这样做,例如......

Type& operator[](int index)
{
    assert(index >=0 && index < size);
    return state[index];
}
Run Code Online (Sandbox Code Playgroud)

我有什么方法可以区分被访问的值和被修改的值?

Type a = myIndexable[2]; //Access
myIndexable[3] = a;  //Modification
Run Code Online (Sandbox Code Playgroud)

这两种情况都在函数返回后发生.有没有其他方法来重载operator [],这可能更有意义?

c++ indexing operator-overloading

25
推荐指数
3
解决办法
4万
查看次数

用例概括与扩展

UML用例图允许两种看似等效的方式来表明给定的用例可能以几种不同的方式实现,即用例概括而不是用例扩展.我已经看到以下基本示例使用相同频率的任一方法建模,有时在单个源中.

用例泛化图像

用例扩展图像

在我看来,扩展是一种比一般化更弱的关系,因为基本情况的专用用例的直接替换必须是概括的,但不一定是扩展.

在我看来,泛化意味着需要多态实现,而扩展意味着要使用一些分支结构.

void makePayment(const PaymentDetails* pd)
{
   pd->pay();
}
Run Code Online (Sandbox Code Playgroud)

而不是

void makePayment(const PaymentDetails* pd)
{
   switch(pd->type)
   {
       case EFT:
                payViaEFT(pd); 
                break;
       case PAYPAL:
                payViaPayPal(pd); 
                break;
       case CREDITCARD:
                payViaCreditCard(pd); 
                break;
   }
}
Run Code Online (Sandbox Code Playgroud)

针对此类实现特定问题的建模是否过早的用例阶段?有更合适的UML图表.关于两者中的哪一个使用是否存在硬性规定?如果是,那么它是什么?

uml use-case

20
推荐指数
3
解决办法
2万
查看次数

在非尾递归函数中使用Scala内部函数时是否存在效率损失?

我对Scala相当陌生,并且仍然在努力开发一种方法,这种方法有效并且可能包含隐藏的性能成本.

如果我定义一个包含内部函数的(非尾部)递归函数.是否为每个递归调用实例化了内部函数的功能对象的多个副本?

例如,以下内容:

def sumDoubles(n: Int): Int = {
    def dbl(a: Int) = 2 * a;
    if(n > 0)
        dbl(n) + sumDoubles(n - 1)
    else
        0               
}
Run Code Online (Sandbox Code Playgroud)

... dbl堆栈中存在多少个对象副本以进行调用sumDoubles(15)

scala

14
推荐指数
2
解决办法
1825
查看次数

将高度自治的演员视为代理人是否合理?

来自mutli-agent系统的学术背景(使用JADE在Java中开发)我只是在外围意识到Actor并发范例.现在我已经开始探索Scala,我忍不住被Agent和Actor方法之间的相似性所打动.

我非常想在我的下一个研究项目中使用Scala的Actor库而不是简单地调用JADE库,因为这会迫使我更深入地掌握语言.此外,JADE专注于根据行为定义所有内容并不适合我的问题.

高度自主的演员和我失踪的特工之间是否存在根本不同的东西?

scala artificial-intelligence agents actor agents-jade

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

使用C++函数参数保证连续内存

Appel [App02]非常简要地提到C(并且可能是C++)提供关于连续存储器中的实际参数的位置的保证,而不是当将地址运算符应用于功能块内的形式参数之一时的寄存器.

例如

void foo(int a, int b, int c, int d)
{
    int* p = &a;
    for(int k = 0; k < 4; k++)
    {
       std::cout << *p << " ";
       p++;
    }
    std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

和一个如...的调用

foo(1,2,3,4);
Run Code Online (Sandbox Code Playgroud)

将产生以下输出"1 2 3 4"

我的问题是"这与调用约定如何相互作用?"

例如,GCC上的__fastcall将尝试将前两个参数放在寄存器中,其余的放在堆栈上.这两个要求是相互矛盾的,有没有办法正式推理将会发生什么,或者它是否受制于实施定义行为的反复无常的性质?

[App02] Java中的现代编译器实现,Andrew w.Appel,第6章,第124页

更新:我想这个问题已得到解答.当我正在寻找的内容(以及参考文献中提到的内容)是由于使用地址而导致参数在内存中的需求明显不匹配时,我认为将整个问题建立在连续内存分配上是错误的.在寄存器中由于调用约定,这可能是另一天的问题.

互联网上有人是错的,有时候有人就是我.

c++ memory-management function calling-convention

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

适用于IaaS和PaaS云系统的UML部署图

我想使用UML部署图模拟以下情况.

在基础架构即服务云平台(如Amazon EC2)上生成一个小型命令和控制机器实例.此实例又负责生成其他实例,并NumberCruncher.py通过类似S3的方式为其提供控制脚本,或者如果程序足够小以适应该字段,则可直接作为启动脚本参数.我尝试使用UML部署图在机器实例是节点的工作假设下对情况进行建模 ,但由于以下原因而不满意.

  • 该图似乎表明将有三个数字cruncher节点.是否有可能在部署图中说明多个节点,就像使用多个对象说明多个对象实例一样.如果节点无法做到这一点,那么这似乎是一个长期存在的问题
  • 反正是否在部署图中显示了部署区域/数据中心的等效内容 ?

最后:

平台即服务怎么样?整个机器实例是一个Node想法,在那一点上彻底崩溃了.在那种情况下你到底做了什么?将整个PaaS提供商视为单个节点并忘记细节?

IaaS节点是机器实例

cloud deployment uml paas iaas

8
推荐指数
1
解决办法
2837
查看次数

g++ 在 Windows 上不使用通配符文件名进行编译

突然间,当使用基于通配符的文件名时,我似乎很难从 Windows(特别是 10)上的命令行编译 C++ 程序(特别是 TDM64 5.1.0)。当给出完整的名称时,效果很好。我以前已经做过无数次了,没有任何问题编辑:但通常不是在 Windows 上......我之前对这个工作的记忆一定是错误的。我缺少什么?

\n
\n
C:\\Users\\Duncan Coulter\\Code>dir *.cpp\n Volume in drive C has no label.\n Volume Serial Number is 9EE6-DBBD\n\n Directory of C:\\Users\\Duncan Coulter\\Code\n\n2016/04/04  01:35 PM             7\xc2\xa0869 LittleMan.cpp\n2016/04/04  01:35 PM             1\xc2\xa0912 main.cpp\n               2 File(s)          9\xc2\xa0781 bytes\n               0 Dir(s)  90\xc2\xa0288\xc2\xa0394\xc2\xa0240 bytes free\n\nC:\\Users\\Duncan Coulter\\Code>g++ *.cpp\ng++: error: *.cpp: Invalid argument\n\nC:\\Users\\Duncan Coulter\\Code>g++ main.cpp LittleMan.cpp\n
Run Code Online (Sandbox Code Playgroud)\n
\n

c++ compilation g++ wildcard tdm-mingw

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

对内联构造函数影响的vtable错误的未定义引用

虽然堆栈溢出还有其他问题,这些问题涉及"未定义的vtable引用"错误消息.以下代码编译或不编译,具体取决于no-args构造函数C()是否在线实现.我知道成员函数m()应该是纯虚拟的,并且这是正确的更改,以便解决问题.令我感到困惑的是,它可以通过明显不相关的变化进行编译.

下面的代码不能用g ++编译(在ubuntu 64位上为4.6.3)并产生预期的'未定义的对vtable for C'消息的引用(考虑到m()的问题,记录仍然是一个可怕的错误消息)

Header.h

#ifndef HEADER_H
#define HEADER_H

class C
{
  public:
    C();
    virtual void m();
};

#endif
Run Code Online (Sandbox Code Playgroud)

Implementation.cpp

#include "Header.h"
C::C() {}
Run Code Online (Sandbox Code Playgroud)

Main.cpp的

#include "Header.h"
int main()
{
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下无关的更改允许编译:

  • 从Implementation.cpp中删除C :: C()的非内联实现
  • 在Header.h中为C()添加琐碎的内联实现

为什么这允许编译?这是编译器错误,优化器问题还是标准难题的黑暗角落?

c++ constructor compiler-errors g++ vtable

5
推荐指数
1
解决办法
2989
查看次数

用于初始化单个变量的 C++ 样式

在初始化自动管理的简单变量而不是通过赋值时,有几种不同的风格。我想知道是否有任何特定的理由偏爱一个而不是另一个,或者这只是一个风格问题。

使用括号很有吸引力,因为它感觉类似于实例化一个对象

double answer(42.0);
ComplexNumber i(0,1);
Run Code Online (Sandbox Code Playgroud)

虽然使用大括号很有吸引力,因为它感觉类似于初始化容器

double answer{42};
std::vector<double> i{0,1};
double i2[] = {0,1};
Run Code Online (Sandbox Code Playgroud)

有什么特别的理由偏爱一种风格而不是另一种风格吗?

c++ coding-style initialization c++11

5
推荐指数
1
解决办法
1500
查看次数

接口定义的关系术语

如果继承是用于实现is-a关系的OO技术,并且组合/聚合实现了一个has-a关系,那么Java/.NET样式接口实现的关系的适当名称是什么?

我真的热衷于术语can-do关系,因为这些接口通常用于指定支持的操作,如Sortable,Clonable等.此外,它听起来确实是肯定的.我想到的唯一一个我真正看过的名字是一个实现的关系,但它并没有真正描述这么多.

.net java oop terminology interface

5
推荐指数
1
解决办法
71
查看次数

为什么C ++元组这么奇怪?

structs当将不同类型的值分组在一起时,通常会创建自定义。通常这很好,而且我个人觉得命名成员访问更容易阅读,但是我想创建一个更通用的API。在其他语言中广泛使用元组之后,我想返回type的值,std::tuple但是发现在C ++中使用它们比在其他语言中使用起来更加难看。

在使元素访问使用整数模板参数时,需要进行哪些工程决策get

#include <iostream>
#include <tuple>

using namespace std;

int main()
{
    auto t = make_tuple(1.0, "Two", 3);
    cout << "(" << get<0>(t) << ", " 
                << get<1>(t) << ", " 
                << get<2>(t) << ")\n";
}
Run Code Online (Sandbox Code Playgroud)

而不是像下面这样简单的东西?

t.get(0)
Run Code Online (Sandbox Code Playgroud)

要么

get(t,0)
Run Code Online (Sandbox Code Playgroud)

有什么好处?我只看到其中的问题:

  • 像这样使用template参数看起来很奇怪。我知道模板语言是图灵完整的,但所有这些……
  • 如果范围太大,它会使通过运行时生成的索引建立索引变得困难(例如,对于一个小的有限范围索引,我已经看到了使用每种可能性的switch语句编写的代码),或者无法进行索引。

编辑:我已经接受了答案。现在,我已经考虑了语言需要知道的内容以及何时需要知道的内容,我认为这确实有意义。

c++ tuples c++-standard-library c++11

5
推荐指数
2
解决办法
250
查看次数

Sokumenzu /侧视图生成器背后的算法

我偶然发现了以下新颖的网站,用于生成名为Sokumenzu / Side View Generator的给定输入文本的“旋转字谜”,该文本生成如下结果的动画版本:

我的名字叫Sokumenzu

我真的很想了解其背后的算法。我尝试查看是否有任何公开显示的javascript可以帮助我做到这一点,但这是一团糟,我对语言的掌握不够坚定,以至于我无法确定真正的作品是否在完成服务器端。

我对如何构建类似的系统有一个粗略的概述,但是它会有自己的缺点(如果真正的方法是硬编码的,可能会有一个小的优势):

预计算

Define an nxnxn cube composed of equally sized sub-cubes
Each sub-cube may either contain a sphere or not
Create a virtual camera orthogonal to one of the cube's faces a fixed distance away
For each of the possible states of the cube:
    Cast rays from the camera and build up an nxn matrix of which cells appear occupied from the camera's point of view.
    Input this matrix into …
Run Code Online (Sandbox Code Playgroud)

algorithm 3d graphics text rotation

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