【问题标题】:char array interpreted as a char pointer in a constructor help pleasechar数组解释为构造函数中的char指针请帮助
【发布时间】:2012-05-12 08:27:59
【问题描述】:
#ifndef ASSETS_H_INCLUDED
#define ASSETS_H_INCLUDED
#include <vector>
#include string.h>

const int ID_Max = 100;
typedef char ID[ID_Max];

struct node;

struct people{
std::vector<ID> T_ID;
std::vector<node*> Nodes;
people(ID t, node* person){
    T_ID.push_back(t);
    Nodes.push_back(person);
}
people(){}
};

struct node {
ID T_ID;
node* Parent;
people* leftChildren;
node* rightChild;
node(ID t, node* p, node* l, node* r) :I_ID(t), Parent(p), rightChild(r) 
{leftChildren = new people(); }
};

#endif // ASSETS_H_INCLUDED

我的问题是它在构造函数中将 ID 解释为 char 指针,所以这是构造函数 people::people(char*, node*) 当我想要 people::people(char[ID_Max], node* ) 与节点相同。如果您有建议,将不胜感激。

【问题讨论】:

  • 为什么不使用std::string 而不是char[100]
  • 我在项目中使用的比较方法是 memcmp,所以我想设置基本大小
  • ...那么下一个明显的问题是为什么要使用memcmp 来比较两个字符串值?
  • std::string 具有 == 以及其他有用的功能。
  • 您的类型 ID 不可分配,因此您不能在标准库容器中使用它。

标签: c++ constructor struct char typedef


【解决方案1】:

如果你写一个带有数组类型的函数签名,它和使用指针是一样的,例如这个:

void f(char p[]);

和这个是一样的:

void f(char *p);

这似乎是您问题的根源。例如,您可能会更好。 std::array&lt;char,ID_Max&gt;(在 C++11 中)或 std::vector&lt;char&gt;(在 C++98 中)。然后,您可以使用&amp;cont[0] 获取指向它包含的连续内存的开头的指针。作为一个小问题,我似乎记得 vector 的内存在 C++98 中并没有严格保证是连续的,但在实践中它总是连续的(你可以依赖它)。措辞在 C++03 中是固定的。

【讨论】:

  • 对于向量一直是有保证的,对于字符串是c++11添加的保证。
  • @stefaanv: herbsutter.com/2008/04/07/… (特别是他说“连续性实际上是向量抽象的一部分。事实上,当发现 C++98标准并没有完全保证连续性,C++03 标准进行了修改以明确添加保证。")
  • 我的立场是正确的。我误读了你的答案,我以为你说“在 C++11 中修复”
  • 这就是我最终得到的感谢。很抱歉直到现在才忘记接受。
  • @thealbinosmurf:谢谢 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
相关资源
最近更新 更多