小编Nei*_*ner的帖子

为什么我的C++子类需要一个显式的构造函数?

我有一个声明和定义构造函数的基类,但由于某种原因,我公开派生的类没有看到那个构造函数,因此我必须在派生类中显式声明转发构造函数:

class WireCount0 {
protected:
    int m;
public:
    WireCount0(const int& rhs) { m = rhs; }
};

class WireCount1 : public WireCount0 {};

class WireCount2 : public WireCount0 {
public: 
  WireCount2(const int& rhs) : WireCount0(rhs) {}
};

int dummy(int argc, char* argv[]) {
    WireCount0 wireCount0(100);
    WireCount1 wireCount1(100);
    WireCount2 wireCount2(100);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我的WireCount1 wireCount1(100)声明被编译器拒绝("没有匹配函数来调用'WireCount1 :: WireCount1(int)'"),而我wireCount0wireCount2声明都没问题.

我不确定我理解为什么我需要提供显示的显式构造函数WireCount2.是因为编译器为其生成了默认构造函数WireCount1,并且该构造函数隐藏了WireCount0构造函数?

作为参考,编译器是i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659).

c++ constructor default derived-class

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

C++动态大小的静态数组益智游戏

在尝试向某人解释为什么C++静态数组无法动态调整大小时,我发现gcc不同意我的看法.考虑到在编译时不知道数组的维度argc,下面的代码如何编译?

#include <iostream>
int main(int argc, char* argv[]) {
    int array[argc];
    for(int i = 0; i < argc; i++) array[i] = argv[i][0];
    for(int i = 0; i < argc; i++) std::cout << i << ": " << char(array[i]) << std::endl;
    //for(int i = 0; i < 100; i++) { std::cout << i << " "; std::cout.flush(); array[i] = 0; }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我用gcc 4.2.1测试了这个,并且指定了-Wall,而没有从编译器看起来那么脏.如果我取消注释最后一个循环,当我分配给数组[53]时,我得到一个段错误.

我以前放在后卫阵列之前的声明后阵列,并已以零填充他们,肯定的是,程序必须被捣毁它的堆栈的一部分,但GCC重新排序堆栈中的变量,使得我无法观察到任何数据损坏.

显然,我并不是想让这段代码"起作用".我只是想了解为什么gcc甚至认为它可以编译代码.任何提示或解释都将非常感激.

更新:感谢所有人的乐于助人和快速响应!

c++ arrays static dynamic

7
推荐指数
2
解决办法
1068
查看次数

在 Visual Studio 2019 中关闭自动建议而不关闭 IntelliSense

我是 Visual Studio 的新手,希望禁用 IntelliSense 自动建议而不完全禁用 IntelliSense。更准确地说,我不希望弹出提示不断覆盖我正在处理的代码,但我仍然希望能够使用Ctrl-Space有时请求建议。我正在用 C/C++ 编码。

我已经看到有关如何为 Visual Studio Code 执行此操作的信息,但我还没有找到任何与 Visual Studio 类似的信息。

或者,如果这只是我不了解如何正确使用 Visual Studio 或 IntelliSense 的问题,请帮助我理解或将我指向真正的 Microsoft 爱好者所在的论坛。

intellisense visual-studio autosuggest

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

在C++中恢复临时赋值

在访问者上下文中,我需要在访问子项之前临时设置变量,然后再恢复该变量.我正在使用以下代码,但我确信有更优雅和正确的方法来执行此操作:

template <typename TYPE> class TemporaryAssignment {
protected:
    TYPE& mVariable;
    TYPE mOriginalValue;
public:
    TemporaryAssignment(TYPE& inVariable, TYPE inValue) 
        : mVariable(inVariable), mOriginalValue(inVariable) {
        mVariable = inValue;
    }
    ~TemporaryAssignment(void) {
        mVariable = mOriginalValue;
    }
};
Run Code Online (Sandbox Code Playgroud)

这允许我写下面的内容:

{
    ...
    TemporaryAssignment<string> t(myVariable, myTemporaryValue);
    visitChildren();
    ...
}
// previous value of myVariable is restored
Run Code Online (Sandbox Code Playgroud)

当临时分配对象超出范围时,该变量将恢复为其先前的值.有什么更好的方法呢?

c++ variable-assignment

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

更新时无法解决Subversion 1.7校验和不匹配错误

我的Subversion 1.7.17工作副本对特定文件不满意但无法更新.任何更新尝试都会给我带来同样的错误,即使我删除了文件或删除目录:

Updating 'trunk/src/Makefile':
svn: E155017: Checksum mismatch for '/Volumes/project/dev/torc/trunk/src/Makefile':
   expected:  78ee11ff73f3b68c903db838b6667ec3
   recorded:  62bbbf4362958e3fd42470650d5b4eb6
Run Code Online (Sandbox Code Playgroud)

我读过SVN - 更新时Checksum不匹配,它的两个主要解决方案是修改.svn/entries或删除和恢复目录..svn/entries在1.7下的顶级文件中没有任何用处,删除和恢复目录并没有解决我的问题.有人有其他建议吗?

svn checksum mismatch

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