小编She*_*ohn的帖子

C++构造函数/析构函数继承

编辑:答案摘要

在下文中,B是A的子类.

这是一个术语问题; ctors和dtor 不是继承的,因为B的ctor/dtor 不会从A的界面借用.一个类至少有一个构造函数,并且只有一个析构函数.

  • 建设者:
    • B不从A继承构造函数;
    • 除非B的ctor明确地调用A的一个 ctor,否则A的默认ctor将 B的ctor主体之前自动调用(这个想法是A需要在B创建之前初始化).
  • 破坏者:
    • B不继承A的dtor;
    • 退出,B的析构函数会自动调用的析构函数.

致谢: 我特别感谢Oli Charlesworth和Kos的答案,我将Kos的答案作为解决方案,因为这是我最了解的答案.


原始邮政

当您在Google上搜索"C++析构函数继承站点:stackoverflow.com"时,您当前会发现以下帖子:

  1. 构造函数和析构函数继承:具有30k +声誉的两个用户说它是继承的,并且它不是
  2. 虚拟析构函数是继承的吗?:这里没有提到会指向析构函数不被继承的东西
  3. C++中的析构函数和继承?:评论似乎表明析构函数是继承的

Q1:我从实践中也知道的是,你不能使用与它的父构造函数相同的原型初始化派生对象而没有明确地定义派生类的构造函数,这是正确的吗?


尽管从帖子中可以清楚地看出析构函数似乎是继承的,但我仍然感到困惑的是,拥有32k声望的用户会说它不是.我写了一个小例子,应该澄清每个人的想法:

#include <cstdio>

/******************************/

// Base class
struct A
{
    A() { printf( "\tInstance counter = %d (ctor)\n", ++instance_counter ); }
    ~A() { printf( "\tInstance counter = %d (dtor)\n", --instance_counter ); }

    static int instance_counter;
};

// Inherited class with default ctor/dtor
class …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance constructor destructor

58
推荐指数
3
解决办法
7万
查看次数

编译器对编译时分支做了什么?

编辑:我把"if/else"案例作为一个例子,有时可以在编译时解决(例如,当涉及静态值时,cf <type_traits>).将以下答案调整为其他类型的静态分支(例如,多个分支或多标准分支)应该是直截了当的.请注意,使用模板元编程的编译时分支不是此处的主题.


在像这样的典型代码中

#include <type_traits>

template <class T>
T numeric_procedure( const T& x )
{
    if ( std::is_integral<T>::value )
    {
        // Integral types
    }
    else
    {
        // Floating point numeric types
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在代码中稍后定义特定模板类型时,编译器会优化if/else语句吗?

一个简单的替代方案是写这样的东西:

#include <type_traits>

template <class T>
inline T numeric_procedure( const T& x )
{
    return numeric_procedure_impl( x, std::is_integral<T>() );
}

// ------------------------------------------------------------------------

template <class T>
T numeric_procedure_impl( const T& x, std::true_type const )
{
    // Integral types
}

template <class T>
T numeric_procedure_impl( const …
Run Code Online (Sandbox Code Playgroud)

c++ templates if-statement type-traits c++11

33
推荐指数
3
解决办法
4051
查看次数

解析一个"简单"的语法

提前抱歉; 我相信这个问题对于习惯使用解析器和语法的人来说几乎是愚蠢的,但这些对我来说都是外国话题,这是我试图轻轻地踩到需要它们的实际案例.

我想为下面的"语言"编写一个解析器,它包含一个看起来像这样的"特殊结构":

\command[ options ]{ contents }
Run Code Online (Sandbox Code Playgroud)

内容可以是任何内容,包括嵌套命令,并且可以包含转义括号或反斜杠\{ \} \\.我意识到"任何事情"并不具体,但理想情况下,如果可能的话,应该通过匹配括号(不包括转义的括号)来确定它们.

选项应该是逗号分隔的赋值表达式如列表name = value,但该值也可以是含有一个引用字符串=,字符.最后是前一个name并且command应该验证正则表达式\w[\w\d\._-+*]*- 也就是说,第一个字符应该是一个字母,剩下的字符应该是字母,数字或其中一个. _ - + *.

用正则表达式写这个似乎过于复杂(例如,因为值可能包含带引号的字符, =,否则它们将分配赋值或名称/值对).所以我认为这里最合适的工具是语法,但是尽管有表面的读数,我只是不确定如何写它(BNF,PEG等?),使用哪种类型的解析器(LR,递归正确等等?) ,以及如何在实际程序中使用解析输出.

我更喜欢Python的答案,它解释了标签,但当然如果必要/更适合我会非常满意的工具组合.


注意:这不是关于LaTeX.我认识到当然是相似的,但是LaTeX比以前的语言复杂得多,例如字符代码根据上下文而变化.我只是要求一个实际的例子(我认为)对于SO来说很简单,但在我的日常工作中对我来说已经很有用了.

python grammar parsing

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

用Matlab进行傅里叶变换

TL; DR(摘要)

很难找到fftMatlab使用的在线示例,正确地规范化幅度/功率值.如果您要在不同长度的不同信号上比较这些值,这一点至关重要.这通常是实值输入的问题,因为在这种情况下通常会提取单侧频谱,因此在计算幅度或功率值时应手动应用幅度变化.你可以在这里找到关于GitHub要点(请告诉我任何错误).

带回家的消息是:

  • 不要直接标准化DFT系数(例如不要写Y = fft(X)/L);
  • 如果您使用的正变换点(例如Y = fft(y,NFFT)/L),那么规范器是Y = fft(y,NFFT)/L;和不是Y = fft(y,NFFT),
  • 如果提取单侧频谱,则需要根据与共轭对DFT系数对应的幅度/功率值进行调整;
  • 如果提取单侧光谱,则应分别计算振幅和功率(即不计算振幅的功率).

我的问题类似于,但比这篇文章更为通用,我认为关于规范化存在错误,最新版本的Matlab(2015)无论如何.我对在CodeReview SE上发布此内容犹豫不决,如果您认为更合适,请在评论中告诉我.

我想用Matlab 来验证以下傅立叶变换代码MX=2*abs(Y);,因为我在网上找到了相互矛盾的信息来源,包括Matlab帮助本身,我无法用某些这样的"食谱"来验证Parseval定理(包括来自MathWorks团队的答案,见下文),特别是那些提取实际输入的单面光谱的答案.

例如,在提取正频率时,通常在网上发现的用于解释实值信号的对称频谱的幅度加倍似乎是错误的(Parseval定理失败),而似乎有必要使用平方根Matlab中的两个系数(我不知道为什么).有些人似乎也直接将DFT系数标准化MX=2*abs(Y)/NFFT;,但我认为这是令人困惑的,应该不鼓励; 幅度定义为复数DFT系数的模数除以信号长度,系数本身不应该被划分.一旦经过验证,我打算将此代码作为GitHub上的要点发布.

function [frq,amp,phi] = fourier_transform( time, vals )
% FOURIER_TRANSFORM computes the Fast Fourier Transform of a given time-series.
% 
% [freq,amp,phi] = fourier_transform(time,vals)
%
% Inputs: …
Run Code Online (Sandbox Code Playgroud)

matlab fft

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

检查/修改迭代器"constness"

我有两个半密切相关的问题.给定作为模板参数传递的STL迭代器类型:

  1. 如何确定类型是对应于const还是非const迭代器?
  2. enable_if除了1.,如何强制(例如使用s)此类型对应于非const迭代器?
  3. 如何从非常量中获取迭代器的常量(反之亦然)?[注:在这篇文章中回答; 不足为奇,你做不到.]

这个问题来自哪里:

我写了一个小类来促进对向量的算术/关系/代数运算(通过向量我的意思是1d固定大小的数据,而不是STL向量).我没有强制使用特定的数据容器,而是定义了一个接口并派生了几个可能的容器,它们基本上"包装"了各种存储数据的方式.其中一个容器是STL迭代器的包装器,我遇到了一些麻烦.

c++ templates iterator const

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

为什么numeric_limits <T> :: min()返回最小值?

当我运行此代码时:

#include <limits>
#include <cstdio>

#define T double

int main()
{
    static const T val = std::numeric_limits<T>::min();
    printf( "%g/2 = %g\n", val, val/2 );
}
Run Code Online (Sandbox Code Playgroud)

我希望看到一个不可预测的结果.但我得到了正确的答案:

(16:53) > clang++ test_division.cpp -o test_division
(16:54) > ./test_division 
2.22507e-308/2 = 1.11254e-308
Run Code Online (Sandbox Code Playgroud)

这怎么可能?

c++ numeric-limits

8
推荐指数
2
解决办法
390
查看次数

使用可变参数模板的工厂模式?

我有一个抽象的课

template <class T> struct A { /* virtual methods */ };
Run Code Online (Sandbox Code Playgroud)

和几个具有各种构造函数的具体派生类

// The constructor of B takes 1 input
template <class T>
struct B
    : public A<T>
{
    B() { /* default ctor */ }
    B( T *input ) { /* initializer */ }

    // .. implement virtual methods
}


// The constructor of C takes 2 inputs
template <class T>
struct C
    : public A<T>
{
    double some_member;

    C() { /* default ctor */ }
    C( T …
Run Code Online (Sandbox Code Playgroud)

c++ factory-pattern variadic-templates c++11

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

为什么[1:2]!=数组[1:2]

我正在学习Julia跟随Wikibook,但我不明白为什么以下两个命令给出不同的结果:

julia> [1:2]
1-element Array{UnitRange{Int64},1}:
 1:2

julia> Array[1:2]
1-element Array{Array,1}:
 [1,2]
Run Code Online (Sandbox Code Playgroud)

道歉,如果有一个我在Wikibook中没有看到的解释,我看了一下,但没有找到.

arrays syntax julia

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

Sublime Text 3 - 禁用Python检查器警告"缩进包含选项卡"

我没有在网上找到这个问题的答案,所以我会在前面说出来; 这是不是一个关于SublimeLinter问题,我希望根据PEP8标准格式化我的Python代码.

如何禁用Python Checker包中的"Indentation contains tabs"警告?

python warnings syntax-checking sublimetext3

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

是否存在"动态蜕变"?

这个问题decltype与多重继承有关.

假设我有以下内容:

  • 带有一些虚方法的抽象类A,
  • 一些使用前面的虚拟方法实现方法的派生类(这些类中的每一个都是一种用例),
  • 最后一个具体类,它继承了先前用例的一个子集,并实现了纯虚方法.

例如:

#include <iostream>

/**
 * "Iterable container"
 */
template <class T>
struct A
{
    virtual T* data() =0;
    virtual const T* data() const =0;
    virtual unsigned size() const =0;

    T* begin() { return data(); }
    T* end() { return data()+size(); }

    const T* begin() const { return data(); }
    const T* end() const { return data()+size(); }
};

// ------------------------------------------------------------------------

/**
 * Iterative assignment
 */
template <class T>
struct B: public A<T>
{ …
Run Code Online (Sandbox Code Playgroud)

c++ multiple-inheritance decltype c++11

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