来自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;对象的字段,然后使用该长度值初始化该对象的数组字段。我该怎么做?
或者,如果有人可以告诉我如何在其方法中初始化对象的字段以解决问题
答案 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::vector
和std::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 ++处理这个问题的方法。