【问题标题】:How to convert this C line into its equivalent C++?如何将此 C 行转换为等效的 C++?
【发布时间】:2017-02-14 01:30:33
【问题描述】:

这是我的结构:

struct HashTable{
      int tsize;
      int count;    //No. of elements in table
      struct HashTableNode **Table;
};

这就是我想要做的:

struct HashTable *h=(struct HashTable *)malloc(sizeof(struct HashTable));
if(!h) return NULL;
h->tsize=size/LOAD_FACTOR;
h->count=0;
h->Table=(struct HashTableNode**)malloc(sizeof(HashTableNode *)*h->tsize);//this line

我无法使用 new 运算符将最后一行转换为等效的 C++ 版本

解决了

我把代码改成了这样:

h->Table=new HashTableNode*[h->tsize];
for(int i=0;i<h->tsize;i++)
    h->Table[i]=new HashTableNode;

我自己做了一些调试,瞧。解决了。

谢谢大家。

【问题讨论】:

  • 首先在 C++ 中你应该避免使用指针。不用指针,你也可以过得很快乐,也能做出很好的程序。其次,如果你想在运行时创建一个数组,那么你应该使用std::vector
  • @LPs 他正在将 C 转换为 C++,这是两个标签都有效的罕见情况。
  • @Borgleader 同时删除 ;)
  • 如果您仍然坚持使用指针,请向我们展示您尝试过的方法,并告诉我们它是如何奏效的。
  • @Olaf 那是一个可怕的哲学。 C++ 不会强迫您使用它的任何或全部功能。这是 C++ 社区中的一个瘟疫,“哦,你正在使用 C++,只需使用 C++ 特性”。 C++ 在很大程度上能够使用 C 代码做 C 可以做的任何事情,而且它仍然是 C++(它不会是“惯用的”C++,但它是 C++)。用指针没问题,用 memcpy 没问题,realloc 和 malloc 和 free 没问题。您最好知道自己在做什么,并能够回答他人,但使用这些工具也没问题。

标签: c++ c malloc new-operator


【解决方案1】:

显然,我同意您问题下的大多数 cmets,但如果您真的需要代码中的指针,您的问题的解决方案可能如下所示。

使用 typedef 说明符定义类型:

typedef HashTableNode* PHashTableNode;

然后:

h->Table=new PHashTableNode[h->tsize];

【讨论】:

  • 永远不要告诉 C++ 程序员永远不要做某事,因为他们这样做只是为了惹恼你。看看你是如何突然有一种冲动要告诉我从不告诉 C++ 程序员从不告诉其他 C++ 程序员要告诉其他 C++ 程序员从不 i> 做点什么?这就是混乱的滋生方式。
  • @Olaf:为什么定义指针类型这么糟糕?有一个文档链接,详细说明为什么不应该这样做?
  • @shrike:你搜索过那个主题吗?这已经在这里解释了几十次了。一些原因:它会导致使用混乱,因为它隐藏了指针的特定语义。而且您不能将限定符应用于它指向的对象(您认为const PHashTableNode p 实际上是什么?提示:它与const HashTableNode *p 非常不同),违反了 const 正确性。
  • @shrike: ...它也使全局命名空间变得混乱。有什么好颂的吗?什么都没有:你必须记住两个名字,如果你想要 const 正确或者有 volatile 或原子对象,则更多。你甚至不安全打字。 *MyStructpMyStruct。如果您需要指向指针的指针,事情会变得更加复杂。如果你必须维护这样的代码(在 1-2 年后成为你自己的代码),你就会碰壁。
  • @Olaf : “你搜索过那个主题吗?” 实际上我搜索了(虽然很快)并找到了this,其中接受的答案与合法的这种做法相吻合,或者this 与前一个链接重复。 (另一个例子,重复的标志往往会加强错误的答案。)无论如何,你反对这种做法的论点是有道理的。以后在做之前我会三思而后行。谢谢。
猜你喜欢
  • 2013-07-27
  • 2022-06-11
  • 2018-12-07
  • 2017-06-12
  • 2019-01-01
  • 1970-01-01
  • 2019-09-29
  • 2011-12-08
  • 1970-01-01
相关资源
最近更新 更多