【问题标题】:Convert variables from c# to c++将变量从 c# 转换为 c++
【发布时间】:2011-02-09 09:14:56
【问题描述】:

c#

public sealed class RC5
    {
        private readonly uint[] _bufKey = new uint[4];
        private readonly uint[] _bufSub = new uint[26];
};

c++(错误)

class RC5
{
protected:
        unsigned __int32[] _bufKey = new unsigned __int32[4];
        unsigned __int32[] _bufSub = new unsigned __int32[26];
};

当然,我在 c++ 代码中遇到了错误,我不知道如何使它正确,有人可以帮助我吗?!谢谢

【问题讨论】:

  • 你能包括你得到的错误吗?
  • @Programming Hero unsigned __int32 _bufKey[] = new unsigned __int32[4];错误:1 IntelliSense:不允许数据成员初始化程序

标签: c# c++


【解决方案1】:
  1. 在 C++ 中,数组“标记”必须跟在变量名之后,而不是类型名之后。
  2. 在 C++ 中有两种方法可以实例化数组:

a) 使它成为一个固定数组:

class RC5 {
  protected:
    unsigned __int32 _bufKey[4];
    unsigned __int32 _bufSub[26];
};

b) 在堆上分配它:

class RC5 {
  public:
    RC5() :
      _bufKey(new unsigned __int32[4]),
      _bufSub(new unsigned __int32[26]) {
    }
    virtual ~RC5() {
      delete [] _bufKey;
      delete [] _bufSub;
    }
  protected:
    unsigned __int32 *const _bufKey;
    unsigned __int32 *const _bufSub;
};

【讨论】:

  • 如果您提倡原始指针,您至少可以提一下有更好的 C++ 方法吗?此外,严格来说,您的析构函数不必是 virtual,因为 C# 类是 sealed,因此不需要继承。除此之外,你的答案是一个很好的答案,因为我的答案似乎被否决了,让我们把你的,这是投票最高的,最好的。
【解决方案2】:

之前所有的答案都是错误的——不仅是轻微的,而且是完全错误的。

C# 中的[] 在 C++ 中是 std::vector<>,而 privateprivate,而不是 protected

另外,还需要在构造函数中初始化变量,new没有用到。

class RC5 {
private:

    std::vector<unsigned> _bufKey;
    std::vector<unsigned> _bufSub;

public:

    RC5() : _bufKey(4), _bufSub(16) { }
};

这需要标准标头&lt;vector&gt; 才能工作。

如果字段的大小是静态的,那么使用 std::array&lt;&gt;(或者,如果您坚持使用静态 C 数组)也是一种选择(这需要现代 C++ 编译器):

class RC5 {
private:

    std::array<unsigned, 4> _bufKey;
    std::array<unsigned, 16> _bufSub;
};

也就是说,get a C++ book。 Stack Overflow 和这样的例子都不能教你基本的 C++ 语法。

【讨论】:

  • @Konrad Rudolph 我知道私有是私有的,但在 c# 中它是密封的,这就是我将其设为保护的原因
  • @MixedCoder 但是protectedsealed 意味着完全不同的东西,在这里保护它没有意义尤其是如果它不是' t 意味着继承(这就是sealed 的意思)。
  • @Konrad Rudolph 那么什么是 = 用 c++ 密封
  • @MixedCoder:不幸的是,没有直接的等价物。为了防止 C++ 中的继承,您需要创建构造函数或析构函数private。但是你不能再正常使用这个类,你需要提供一个特殊的方法来创建这个类——所以这在大多数时候不是一个可行的解决方案!而不是让你的类sealed,在 C++ 中你会清楚地记录你的类不能被继承的事实。
  • @MixedCoder:我认为如果您认为 C++ 类似于 C#,那么您将很难编写 C++。仅在这个问题上,我们就看到了几个重要的区别。听听这个人;买一本好书。
【解决方案3】:

你不能直接在类定义中初始化 C++ 中的成员,你必须在方法(通常是构造函数)中设置它们。

这是因为类定义可以在不同的文件中多次加载(类通常定义在头文件中,头文件通常包含在其他头文件或CPP文件中),这会导致一段代码多次执行。

这是解决方案:

class RC5
{
protected:
    unsigned* _bufKey;
    unsigned* _bufSub;
public:
    RC5(){
        this->_bufKey = new unsigned[4];
        this->_bufSub = new unsigned[26];
    }
};

或者这个

class RC5
{
protected:
    unsigned _bufKey[4];
    unsigned _bufSub[26];
};

当然好的做法是将方法体与类定义分开,但这很容易做到。

【讨论】:

  • 错误:IntelliSense:需要一个标识符,IntelliSense:需要一个';',IntelliSense:需要一个';',IntelliSense:类“RC5”没有成员“_bufSub”,IntelliSense:类“RC5 " 没有成员 "_bufKey"
  • 更改后至少应该可以编译,但由于许多不同的原因,它是糟糕的 C++,而且它不是直接翻译。
【解决方案4】:

错误表明真正的问题:

不允许使用数据成员初始化器

您不能在 C++ 中声明类的成员并在同一行中对其进行初始化。相反,您必须声明成员并分别初始化它们(在构造函数中):

class RC5
{
protected:
        unsigned __int32[] _bufKey;
        unsigned __int32[] _bufSub;

public:
        RC5();
};

RC5::RC5()
{
    this._bufKey = new unsigned __int32[4];
    this._bufSub = new unsigned __int32[26];
}

(我的 C++ 语法生疏了,如有任何语法错误,敬请见谅。)

【讨论】:

  • 错误:IntelliSense:表达式必须有类类型,IntelliSense:需要一个标识符,IntelliSense:需要一个';',IntelliSense:需要一个';'
【解决方案5】:

C++ 类型是 unsigned int

另请注意,您不能使用 new 以这种方式初始化 C++ 数组。您必须使用指针并为其分配内存。

【讨论】:

  • unsigned __int32 _bufKey[] = new unsigned __int32[4];错误:1 IntelliSense:不允许数据成员初始化程序
  • 我最初的帖子暗示“__int32”不是 C++ 中的一种类型。我猜 PO 正在讨论如何初始化。在这种情况下,应该遵循 mzabsky 描述的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多