【问题标题】:Accessing elements in an array of pointers访问指针数组中的元素
【发布时间】:2016-02-01 19:12:07
【问题描述】:

我在访问指针数组的元素时遇到问题。我会尽量减少课程。这是处理我代码中所有类型数据的头文件的一部分,然后是源文件。关于这些课程的一点点。它们都是从 Data 类派生的。 class2 派生自 class1,class3 是 class2 的集合(数组)。

class class1
{
  public:
    class1(const char * S ) : Value(v), v(S)   {}
    class1(const class1 &S) : Value(v), v(S.v) {}
    Str &Value;
  private:
    Str v;
};

class class2 : public class1
{
  public:
    class2( const char * N, const char * V) : class1(V), n(N) {}

  protected:
    Str n;
};

class class3;
{
  public:
    class3 (                               ) {datum = 0;}
    class3 (const class3 &D                ) {set(D) ;}
    class3 (const class2 &S                ) {datum = 0; *this+= S;}
    class3 (const char * nm, const char * v) {datum =0; *this+=class2(nm,v);}

    class2 & operator [] = (const char *N);
    Data & operator += (const Data & D);
    operator class2 * () {return datum? *datum : 0}
    operator class2 **() {return datum? datum : 0}

  protected:
    class2 ** datum;
    class3 & set (const class3 &D);
};

这是源文件的一部分。

class3 & class3:: set (const class3 &S)
{
  int ents = S.Strs ();  // How many elements in array
  datum = new StrDatum * [ents + 1];

  int i;
  for (i = 0; i < ents; i++)
  {
    datum[i] = new StrDatum (*S.datum[i]);
  }
  datum[i] = 0;
  return *this;
} 
Data & class3::Operator += (const Data & D) // Data is the base class for all data-type classes
{
  if (D.Is (class2Dtype)) // dataType enum {class2Dtype = 2; class3Dtype = 3; etc... }
  {
    int ents = this->Strs();
    class 2 ** tmp = new class2 * [ents +1];

    int i;

    for (i=0; i < ents; i++)
    {
      tmp[i] = datum[i];
    }
    tmp[i++] = (class2 *) MakeMe (D); // Create a class2 instance
    tmp[i] = 0;
    delete [] datum;
    datum = tmp;
  }
  return *this;
}

好的。我已经创建了数组,并且正在尝试访问它。我可以访问第一个元素,但是当我尝试访问第二个元素时出现分段错误。

// I create an instance of recordScreen where the array of pointer is created.
// This class has a method called GetData which retrieves the array
// In recordScreen.h
//   class2 & GetData(void);

recordScreen recSc; 
recSc.run();          // The array is created

// If want to see the first element value
Str data = ((class2 *)recSc.GetData())[0].Value; // This works fine.

//But when I try:
Str data2 = ((class2 *)recSc.GetData())[1].Value; // Segmentation Fault

// I check how many elements it has.
class3 test = recSc.GetData();
cout << "Elements = " << test.Strs() << endl; // Output = 2

顺便说一句,我没有编写任何这些类,但我试图弄清楚它们是如何工作的。如果还有什么要补充的,请告诉我。

【问题讨论】:

  • 1.您应该使用调试器并单步执行您的代码以找到您的段错误的确切来源。
  • 2.最好不要使用原始指针或它们的数组。而是使用标准容器类或智能指针。
  • class1 中的 vValue 是什么?
  • class2( const char * N, const char * V) : class1(V), n(N) - 没有接受 const char* 的 class1 构造函数。
  • 类中的参考资料要求您编写复制构造函数和赋值运算符。这是一个可怕的反模式。把它装箱,看着虫子掉下来。

标签: c++ arrays pointers segmentation-fault


【解决方案1】:

您好,我刚刚找到了一种访问数组元素的方法。这比我想象的要容易得多。

recordScreen recSc; 
recSc.run();          // The array is created

class2 ** item;
item = recSc.GetData();

cout << item[0]->Value << endl; // First element
cout << item[1]->Value << endl; // Second element

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-11
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多