【问题标题】:class constructor with structure array (direct)具有结构数组的类构造函数(直接)
【发布时间】:2013-12-16 18:52:17
【问题描述】:

更新:

我看到我在这里造成了很多混乱,对不起那些家伙.. 感谢 Roman 提供向量的想法 ^^

澄清我的问题:我想通过将整数作为参数传递(我不想为 dem 数组创建全局或局部变量)并复制它们来将结构数组直接放入创建的类(在 main() 中)进入班级成员

问题是我在初始化类时失败了,我的尝试:

struct _Note
{
    int nFrequenz;
    int nTakt;
};

class _Chart
{
public:
    _Chart( std::vector<_Note> vNotes )
    {
        for( int i = 0; i < vNotes.size(); i++ )
            this->_chart.push_back( vNotes[i] ); 
    }

private:
    std::vector<_Note> _chart;
};

void main()
{
    _Chart x(
        { {1,2}, {2,3} } 
    ); 
    // not working, wrong initialization
    // still confused about the brackets ^^

    getchar();
}

【问题讨论】:

  • 如果没有为数组指定长度,您希望sizeof( p ) 是什么?最好使用std::vector 来解决这个问题。
  • 我会尝试将参数类型设为klasse const,并尝试使用赋值运算符而不是 ()。
  • main() 返回int,而不是void。此外,以下划线后跟大写字符开头的名称保留用于实现(编译器和标准库)。
  • 请避免编辑您的问题,完全破坏您的原始问题。这将使任何现有的答案无用。更喜欢放置另一个 UPDATE 部分来指定更改,或者什么对你有用!
  • 您的“括号”不起作用。只需创建_Note 的实例,将其添加到main() 中的向量中,然后将其传递给构造函数。是的,如果您不想复制向量两次,我强烈建议您通过引用获得vNodes

标签: c++ arrays class initialization structure


【解决方案1】:

当作为参数传递时,struktur p[] 衰减为指针(类似于struktur* p)。这个指针的大小肯定不是你在确定元素数量时要寻找的。​​p>

相反,为什么不提供类似于标准容器的两个迭代器构造函数?

【讨论】:

  • 是的,sizeof(p) == sizeof(uintptr_t) 对于 x86 机器是 4
【解决方案2】:

您也需要传递元素计数:

klasse( struktur p[], size_t count )
{
    _chart = new struktur[count];
    // copy array in one shot as no deep copy is needed here.
    memcpy(_chart, p, count * sizeof(struktur));
}

【讨论】:

    【解决方案3】:

    数组在传递时衰减为指针。因此,您必须将数组中元素的数量作为附加参数传递给函数。但是,在这种情况下,您可以选择。

    glob 定义移到klasse 声明上方。然后在构造函数中,您应该能够使用sizeof(glob)/sizeof(struktur); 获取对象的数量。您应该能够动态分配并在之后进行成员明智的复制。

    【讨论】:

      【解决方案4】:

      为什么不使用 std::vector 容器模板?

      class klasse
      {
      public:
          klasse(std::vector<struktur>& strs)
          {
              _chart = new struktur[strs.size()];
              for( int i = 0; i < strs.size(); i++ )
              {
                  this->_chart[i] = strs[i];
              }
          }
      
      private:
          struktur* _chart;
      };
      

      在 main() 中:

      void main()
      {
          std::vector<struktur> myStructs;
      
          myStruct.push_back(glob[0]);
          myStruct.push_back(glob[1]);
          myStruct.push_back(glob[2]);
      
          klasse y(myStructs); 
          getchar();
      }
      

      这简单而优雅。

      [Upd.] 是的,在您的示例中,sizeof(p) 将等于 sizeof(uintptr_t),因为 p 是指针类型。

      【讨论】:

      • 为什么不使用std::vector 作为第一名的成员?
      • 嗯,是的。但问题是“如何初始化”,我刚刚展示了如何初始化。 std::vector 作为成员和 std::copy 这也很好。
      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多