小编Mic*_*fik的帖子

Linux命令行全局搜索和替换

我正在尝试搜索并替换linux机器上grep匹配的所有文件中的字符串.我有一些我想做的事情,但我不确定如何最好地将它们串在一起.

grep -n 'foo' * 会给我输出形式:

[filename]:[line number]:[text]
Run Code Online (Sandbox Code Playgroud)

对于grep返回的每个文件,我想用"bar"替换"foo"并将结果写回文件.有没有一个好方法呢?也许是一个奇特的管道?

linux awk grep sed

79
推荐指数
4
解决办法
10万
查看次数

为类层次结构重载operator ==的正确方法是什么?

假设我有以下类层次结构:

class A
{
    int foo;
    virtual ~A() = 0;
};

A::~A() {}

class B : public A
{
    int bar;
};

class C : public A
{
    int baz;
};
Run Code Online (Sandbox Code Playgroud)

operator==为这些类重载的正确方法是什么?如果我让它们都是自由函数,那么B和C不能在没有强制转换的情况下利用A的版本.它还会阻止某人进行只有A引用的深度比较.如果我将它们作为虚拟成员函数,那么派生版本可能如下所示:

bool B::operator==(const A& rhs) const
{
    const B* ptr = dynamic_cast<const B*>(&rhs);        
    if (ptr != 0) {
        return (bar == ptr->bar) && (A::operator==(*this, rhs));
    }
    else {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

再次,我仍然需要施放(并且感觉不对).有没有一种首选的方法呢?

更新:

到目前为止只有两个答案,但看起来正确的方式类似于赋值运算符:

  • 使非叶类抽象化
  • 在非叶类中受保护的非虚拟
  • 在叶类中公共非虚拟

任何用户尝试比较两个不同类型的对象都不会编译,因为基本功能受到保护,叶子类可以利用父类的版本来比较那部分数据.

c++ operator-overloading

48
推荐指数
4
解决办法
7万
查看次数

在C++函数调用中使用increment运算符是否合法?

关于以下代码是否是合法的C++ ,这个问题一直存在争议:

std::list<item*>::iterator i = items.begin();
while (i != items.end())
{
    bool isActive = (*i)->update();
    if (!isActive)
    {
        items.erase(i++);  // *** Is this undefined behavior? ***
    }
    else
    {
        other_code_involving(*i);
        ++i;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是erase()将使有问题的迭代器无效.如果在i++评估之前发生这种情况,那么这样的增量i在技​​术上是未定义的行为,即使它似乎与特定的编译器一起使用.辩论的一方面说,在调用函数之前,所有函数参数都已完全评估.另一方说,"唯一的保证是i ++将在下一个语句之前和使用i ++之后发生.无论是在擦除(i ++)之前还是之后都依赖于编译器."

我打开这个问题,希望能够解决这个问题.

c++ standards function

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

std :: vector to string with custom delimiter

我想用自定义分隔符将a的内容复制vector到一个long string.到目前为止,我已经尝试过:

// .h
string getLabeledPointsString(const string delimiter=",");
// .cpp
string Gesture::getLabeledPointsString(const string delimiter) {
    vector<int> x = getLabeledPoints();
    stringstream  s;
    copy(x.begin(),x.end(), ostream_iterator<int>(s,delimiter));
    return s.str();
}
Run Code Online (Sandbox Code Playgroud)

但我明白了

no matching function for call to ‘std::ostream_iterator<int, char, std::char_traits<char> >::ostream_iterator(std::stringstream&, const std::string&)’
Run Code Online (Sandbox Code Playgroud)

我试过charT*但我得到了

error iso c++ forbids declaration of charT with no type
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用char,ostream_iterator<int>(s,&delimiter) 但我在字符串中得到奇怪的字符.

任何人都可以帮助我理解编译器在这里期待什么吗?

c++ string vector

27
推荐指数
6
解决办法
3万
查看次数

我们的代码糟透了,我无力修复它.救命!

我们的代码很糟糕.实际上,让我澄清一下.我们的代码很糟糕.它很难调试,并且充满了很少人理解甚至记住的抽象概念.就在昨天,我花了一个小时在一个我工作了一年多的地方进行调试,发现自己在想,"哇,这真的很痛苦." 这不是任何人的错 - 我确信这一切最初都是完全合理的.最糟糕的部分通常是它只是工作...如果你不要求它做任何超出其舒适区域的事情.

我们的新代码非常好.我想我们在那里做了很多好事.它清晰,一致,(希望)可维护.我们有一台运行用于持续集成的Hudson服务器,我们已经开始使用单元测试套件了.问题是我们的管理层专注于编写新代码.没有时间给Old Code(甚至旧的新代码)提供它迫切需要的TLC.在任何特定时刻,我们的scrum积压(针对六个开发人员)有大约140个项目和大约十几个缺陷.这些数字并没有太大变化.我们正在以尽可能快的速度添加东西.

那么我该怎么做才能避免马德里调试会话在Old Code的深处陷入困境呢?每个sprint都充满了新的发展和showstopper缺陷.特别...

  • 我能做些什么来帮助维护和重构任务获得足够高的优先级来工作?
  • 您是否采用任何特定于C++的策略来帮助防止新代码如此迅速地腐烂?

c++ maintainability refactoring scrum unit-testing

26
推荐指数
2
解决办法
1761
查看次数

为什么标准C++容器适配器不能提供清晰的功能?

有谁知道为什么std :: queue,std :: stack和std :: priority_queue不提供clear()成员函数?我必须假装这样一个:

std::queue<int> q;
// time passes...
q = std::queue<int>();  // equivalent to clear()
Run Code Online (Sandbox Code Playgroud)

IIRC clear()由可用作底层容器的所有东西提供.有没有充分的理由没有容器适配器提供它?

c++ standards stl

23
推荐指数
2
解决办法
5499
查看次数

如何在C++代码中避免使用dynamic_cast?

假设我有以下类结构:

class Car;
class FooCar : public Car;
class BarCar : public Car;

class Engine;
class FooEngine : public Engine;
class BarEngine : public Engine;
Run Code Online (Sandbox Code Playgroud)

我们也给它Car一个句柄Engine.FooCar将使用a创建A ,FooEngine*并使用a BarCar创建BarEngine*.有没有办法安排事情,所以一个FooCar对象可以调用成员函数而FooEngine无需向下转换?

这就是为什么类结构按照现在的方式布局的原因:

  1. 所有人Car都有Engine.此外,一个FooCar只会使用一个FooEngine.
  2. 所有人都共享数据和算法Engine,我宁愿不复制和粘贴.
  3. 我可能想写一个需要Engine了解它的函数Car.

一旦我dynamic_cast在编写这段代码时输入,我就知道我可能做错了什么.有一个更好的方法吗?

更新:

根据目前给出的答案,我倾向于两种可能性:

  1. Car提供一个纯虚getEngine()函数.这将允许FooCarBarCar具有返回正确类型的实现Engine.
  2. 将所有Engine功能吸收到 …

c++ oop inheritance dynamic-cast car-analogy

18
推荐指数
4
解决办法
6488
查看次数

带有模板的c ++类无法找到其构造函数

我有一个问题,我真的不明白.我有一个类Node.

template<class T>
class node {
protected:
    T _data;
public:
    node(T data);   
};
Run Code Online (Sandbox Code Playgroud)

这是在"node.h"文件中.在"node.cpp"文件中,有这个构造函数:

#include "node.h"

template<class T>
node<T>::node (T data) {
    _data = data;
}
Run Code Online (Sandbox Code Playgroud)

虽然编译器没有发现错误,但链接器(ld)告诉我:

/ usr/bin/ld:未定义的符号:

节点<int>的::节点(int)的

奇怪的部分...如果我将构造函数从.cpp移动到.h文件,一切正常.问题出在哪儿?

c++ templates

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

关闭C++注释中的vim语法高亮显示

我最近下载了vim 8.0.我不知道我是否搞砸了什么或默认情况发生了变化,但是在这段代码中...

int foo()
{
    // This is a comment containing a "string" and the number 5.
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

...... "string"并且5是不同的颜色.它与正常代码中显示的颜色相同.我以前从未见过这个.我怎么能把它关掉?

c c++ vim syntax-highlighting

15
推荐指数
1
解决办法
825
查看次数

为什么我必须按Ctrl + D两次才能关闭标准输入?

我有以下Python脚本,如果输入不是数字,则读取数字并输出错误.

import fileinput
import sys
for line in (txt.strip() for txt in fileinput.input()):
    if not line.isdigit():
        sys.stderr.write("ERROR: not a number: %s\n" % line)
Run Code Online (Sandbox Code Playgroud)

如果我从stdin获得输入,我必须按Ctrl+ D 两次才能结束程序.为什么?

当我自己运行Python解释器时,我只需要按Ctrl+ D一次.

bash $ python test.py
1
2
foo
4
5
<Ctrl+D>
ERROR: not a number: foo
<Ctrl+D>
bash $
Run Code Online (Sandbox Code Playgroud)

python bash stdin

13
推荐指数
3
解决办法
5366
查看次数