初始化方法中的字段

时间:2014-07-22 14:29:58

标签: c++ class object

来自javascript的c ++新手。 我曾经习惯在其方法中初始化对象的新属性。例如:

var object = {
    setVariables: function() {
        this.arrayLength = 4;
        this.array = [];
        for(var i=0; i<this.arrayLength; i++) {
            this.array[i] = i;
        }
    }
}

所以我根据另一个属性设置了一个属性。

但是用c ++,

class Object = {
    int arrayLength;
    int array[arrayLength];
}

我无法初始化数组,直到我知道它的长度,在我使用构造函数或方法之前我无法设置它。如果我尝试用方法做到这一点......

class Object = {
    public:
    void setVariables() {
        this->array[4]; /* this doesn't fly because I haven't initialized the array and I can't initialize until I know its length /*
    }
}

我也不能使用构造函数,因为构造函数只是设置字段,但不会从我读过的内容中初始化它们。

这只是我常常混淆的一个例子,即如何根据其他字段设置和初始化对象的字段。如果它混淆了我想要做的事情,请采用这个具体的例子:

我想初始化并设置一个&#39; arrayLength&#39;对象的字段,然后使用该长度值初始化该对象的数组字段。我该怎么做?

或者,如果有人可以告诉我如何在其方法中初始化对象的字段以解决问题

3 个答案:

答案 0 :(得分:2)

你正在努力学习C ++。尽管C ++语法相似,但它完全不像javascript(或java或C#)。

在C ++中,您定义了类,类构造函数在内存中构建对象,将成员变量设置为所需的值。您必须使用构造函数来执行您想要执行的操作。从您显示的代码中,您似乎正在尝试重新实现std::vector

class object
{
    int   m_size;   // size of the array
    int * m_array;  // pointer to the array

    public:
    // this is the constructor
    // it initializes m_size to the value of size
    // it allocates an array of int on the heap, and initializes 
    // the m_array pointer to the address of that array, then 
    // initializes each entry in the array 
    object( int size ) : m_size( size ), m_array( new int[size] )
    {
        for ( int i = 0; i < m_size; ++i ) 
        { 
            m_array[i] = i;
        }
    }

    // this is the destructor; it is **very** important
    // this frees the dynamically allocated array when the
    // object instance is destroyed
    ~object()
    {
        delete [] m_array;
    }

    int operator[]( int index ) const
    {
        if ( index < 0 || index >= m_size ) throw std::range_error();
        return m_array[ index ];
    }
    int & operator[]( int index ) 
    {
        if ( index < 0 || index >= m_size ) throw std::range_error();
        return m_array[ index ];
    }
};


object o(5);
o[1] = 99;
int v = o[1];

不保证100%正确 - 我没有编译它,你也不应该使用它。这就是std::vectorstd::array的用途。

我强烈建议您获得一本好的C ++书籍,可能是编程 - 使用C ++的原理和实践,并阅读它。你会更成功。

答案 1 :(得分:1)

您可以通过将其声明为int* array;来动态分配数组,然后在构造函数中执行array = new int[arrayLength];。或者您可以使用vector,您可以随时调整大小。

答案 2 :(得分:0)

如果在类中定义变量,除非你的变量是const或static,否则C ++不允许初始化。例如,您无法初始化

class foo{
int x = 10; 
};

在函数内部,只需使用

即可在C ++中初始化一维数组
int x[10](); // <-- initialize to 0, use x[10](y) to initialize to y.

对于动态数组,您可以在构造函数中动态构造它们并在destuctor中对它们进行破坏。 例如

class foo{    
    int *array;     
    int arraySize;
    foo(int size){   
        arraySize=size;
        array = new int[arraySize];  //constructs array with the dynamic size
                                       //don't forget to throw them away    
    }
    ~foo(){      
        delete array;    
    } 
}

在STL(vector)和0x中有更简单的方法来实现动态数组,但这就是经典的C ++处理这个问题的方法。