小编Con*_*ser的帖子

函数可以接受抽象基类作为参数吗?

我已经对基本类和封装的想法感到满意,我已经开始着手理解多态,但我无法弄清楚如何使其工作.我搜索过的很多例子都是真的,非常强迫(类Foo和Bar对我来说太过抽象,看不到实用程序),但这就是我理解基本概念的方法:你编写一个基类,派生出一个从它改变基本方法所做的一切其他事情(但不是它们"是什么"),然后你可以编写通用函数来接受和处理任何派生类,因为你有点标准化它们的外观.在这个前提下,我试图实现基本的Animal-> cat/dog层次结构,如下所示:

class Animal {
  public:
    virtual void speak() = 0;
};

class Dog : public Animal {
  public:
    void speak() {cout << "Bark bark!" << endl;}
};

class Cat : public Animal {
  public:
    void speak() {cout << "Meow!" << endl;}
};

void speakTo(Animal animal) {
    animal.speak();
}
Run Code Online (Sandbox Code Playgroud)

在哪里说话可以采取一般种类的动物,并使它,好吧,说话.但据我所知,这不起作用,因为我无法实例化Animal(特别是在函数参数中).我问,那么,我是否理解多态性的基本效用,我怎样才能真正做到我试图做的事情?

c++ polymorphism inheritance abstract-class

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

gcc会自动"展开"if语句吗?

假设我有一个如下所示的循环:

for(int i = 0; i < 10000; i++) {
    /* Do something computationally expensive */
    if (i < 200 && !(i%20)) {
        /* Do something else */
    }
}
Run Code Online (Sandbox Code Playgroud)

其中一些琐碎的任务卡在一个只运行少数几次的if语句后面.我总是听说"if-statements in loops很慢!" 因此,为了(略微)提高性能的希望,我将循环拆分为:

for(int i = 0; i < 200; i++) {
    /* Do something computationally expensive */
    if (!(i%20)) {
        /* Do something else */
    }
}

for(int i = 200; i < 10000; i++) {
    /* Do something computationally expensive */
}
Run Code Online (Sandbox Code Playgroud)

gcc(带有适当的标志,如-O3)会自动将一个循环分成两个,还是仅展开以减少迭代次数?

c optimization gcc unroll

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

你认为多个初始化步骤"形式不好"吗?

我正在用C++编写一个物理模拟(Ising模型),它在方格上运行.我的程序的核心是我的Ising类,它带有一个构造函数,用于调用晶格的行和列尺寸.我还有另外两种方法来设置系统的其他参数(温度和初始状态),在进化系统之前必须调用它们!因此,例如,示例程序可能如下所示

int main() {
    Ising system(30, 30);
    system.set_state(up);
    system.set_temperature(2);

    for(int t = 0; t < 1000; t++) {
        system.step();
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果在system.step()之前未调用system.set _*()方法,则system.step()会引发异常,提醒用户注意该问题.我用这种方式实现它来简化我的构造函数; 这是不好的做法吗?

c++ oop

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

提供维度后 boost::extent 对象的类型是什么?

说我有

#include <boost/multi_array.hpp>
using intArray3D = boost::multi_array<int, 3>;
Run Code Online (Sandbox Code Playgroud)

我想创建一堆intArray3D形状相同的s:

auto my_shape = boost::extents[3][4][5];
intArray3D xs(my_shape), ys(my_shape), zs(my_shape);
Run Code Online (Sandbox Code Playgroud)

使用auto赋值boost::extents[3][4][5]给变量很容易,但我如何具体找出底层类型?

c++ boost boost-multi-array

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

为什么Git在检查旧版本时会显示某些新文件夹?

我还在学习Git的绳索(喜欢它!)但是前几天我注意到了一些我不明白的行为.实质上,我们有三个文件夹在不同的时间被移入存储库(一个在我们创建了repo之后,一个稍后,一个刚刚出现).最近,我不得不从旧版本中获取一些代码.我用了

git checkout <old SHA1 hash>
Run Code Online (Sandbox Code Playgroud)

当我注意到Git显示旧文件夹(应该如此),以及最新的文件夹(在签出提交后很长时间内添加到repo中)时,我们可以启动我们的第一个签到.但它没有显示第二个文件夹.

什么会导致Git显示旧版本的最新文件夹?

git revision git-checkout

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

如何将列表附加到R数据框?

我一直在玩ggmap R包,我真的很喜欢它用于显示地理数据的绘图功能.我一直试图用geocode函数制作一些城市人口数据的简单图,但我无法弄清楚如何以逻辑方式排列数据.就目前而言,我已经将数据结构化为一个列表

              City  Type Population
1          Detroit  city     713777
2     Grand Rapids  city     188040
3           Warren  city     134056
4 Sterling Heights  city     129699
5          Lansing  city     114297
6        Ann Arbor  city     113934
Run Code Online (Sandbox Code Playgroud)

并且我想用"返回的纬度和经度条目"附加"列" geocode.具体来说,如果上面的数据框架被命名为密歇根州,我正在抓住坐标

lapply(as.vector(michigan$City), geocode)
Run Code Online (Sandbox Code Playgroud)

它采用字符串(在本例中为城市名称)并使用Google Maps api猜测坐标,生成列表列表:

[[1]]
        lon      lat
1 -83.04575 42.33143

[[2]]
        lon      lat
1 -85.66809 42.96336

[[3]]
       lon    lat
1 -83.0282 42.493

[[4]]
       lon      lat
1 -83.0302 42.58031

[[5]]
        lon      lat
1 -84.55553 42.73253

[[6]]
        lon      lat
1 -83.74304 42.28083
Run Code Online (Sandbox Code Playgroud)

我想将纬度和经度值附加到 …

r ggmap

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