C ++在构造函数中初始化数组

时间:2015-11-28 14:44:45

标签: c++

.cpp:

<?php
/**
 * Plugin Name: Fix Instagram oEmbed
 * Plugin URI: https://10up.com
 * Description: Fix Instagram oEmbed.
 * Author: 10up
 * Version: 1.0.0
 * Author URI: https://10up.com
 * License: GPL2
 */

namespace TenUp\Plugin\InstagramFix;
add_filter( 'oembed_providers', __NAMESPACE__ . '\\oembed_providers' );


function oembed_providers( $providers ) {
    if ( ! isset( $providers['#https?://(www\.)?instagr(\.am|am\.com)/p/.*#i'] ) ) {
        $providers['#https?://(www\.)?instagr(\.am|am\.com)/p/.*#i'] = array(
            'https://api.instagram.com/oembed',
            true
        );
    }
    return $providers;
}

.h:

 Person::Person(int _id[9], string name, int age) :_age(age), _name(name){};

如何使用与年龄和姓名相同的方法来提交'id'字样?

3 个答案:

答案 0 :(得分:2)

数组没有复制构造函数,而且此构造函数中的参数_id

 Person::Person(int _id[9], string name, int age) :_age(age), _name(name){};

被隐式转换为指向作为参数传入的数组的第一个元素的指针。这实际上是构造函数看起来像

 Person::Person(int *_id, string name, int age) :_age(age), _name(name){};

并且指针不会保留信息,无论它是指向单个对象还是指向数组的第一个对象。

因此,您应该使用另一个参数附加此参数,该参数将指定底层数组的大小(如果将此参数作为参数。)

例如

Person::Person(int *_id, size_t id_num, string name, int age) 
    :_id {}, _age(age), _name(name)
{
    size_t size = id_num < 9 ? id_num : 9;
    std::copy( _id, _id + size, this->_id );
}

答案 1 :(得分:1)

class Person
{
    typedef std::array<int, 9> ids_t;
    Person(ids_t, string name, int age);

private:
    ids_t _id;
    string _name;
    int _age;
};

Person::Person(ids_t id, string name, int age) : _id(id),  _age(age), _name(name){}

答案 2 :(得分:1)

由于您无法分配C风格的数组,甚至无法使用另一个数组进行初始化,因此可以使用C ++风格的数组(可以分配和复制初始化)使任务更简单:

array<int, 9> _id;

Person::Person(array<int, 9> id, string name, int age)
: _id(id), _age(age), _name(name) { }

或者,如果你坚持使用C风格的数组,你可以使用std::copy将参数数组复制到成员数组:

Person::Person(int id[9], string name, int age) : _age(age), _name(name)
{
   copy(id, id + 9, _id);
};

但请注意,传递C风格的数组很糟糕,因为编译器会将所有C风格的数组参数视为指向数组第一个元素的指针。因此id参数的类型实际上是int*,因此Person构造函数的调用者可以传递(使用隐式array-to-pointer decay任意大小的数组,指向 int,甚至是nullptr的指针,如演示here。尝试从任何这些无效参数中复制9个元素将导致未定义的行为。