我是C ++的新手,我在使用指针和引用传递创建对象数组时遇到了很大的麻烦。这不是实际的代码;这是代码本质上做的一个例子。
#include <iostream>
class MyClass
{
public:
MyClass();
static int doStuff(MyClass *&classArray);
void print_number();
private:
int number;
};
MyClass::MyClass()
{
}
int MyClass::doStuff(MyClass *&classArray)
{
int i = 0;
for (i = 0; i < 10; i++) {
*classArray[i].number = i;
}
return i;
}
void MyClass::print_number()
{
std::cout << number << "\n";
}
int main(void)
{
MyClass *test = nullptr;
int p = MyClass::doStuff(test);
std::cout << p << '\n';
for (int i = 0; i < 10; i++) {
test[i].print_number();
}
return 0;
}
编译时会出现分段错误。
答案 0 :(得分:1)
它无法正常工作,因为您需要分配数组,因为该函数正在尝试访问尚未初始化以容纳该元素数量的数组元素。你可以通过
来做到这一点MyClass *test = new MyClass[array_size];
或者
MyClass test[array_size];
或者通过使用可调整大小的容器(如std :: vector)并相应地更改函数参数
答案 1 :(得分:1)
这就是你的做法(不要忘记在你的程序或析构函数的末尾删除带有delete[]
的classArray:
new运算符必须有默认构造函数,如果要使用非默认值,则更容易创建复制构造函数,然后是临时对象和副本。
#include <iostream>
class MyClass
{
public:
MyClass();
MyClass(int x, int y);
MyClass(MyClass &OldClass);
static int doStuff(MyClass *&classArray, int Size, int x, int y);
void print_number();
private:
int number, x, y;
};
MyClass::MyClass()
{
number = 0;
x = 0;
y = 0;
}
MyClass::MyClass(int x, int y)
{
number = 0;
this->x = x;
this->y = y;
}
MyClass::MyClass(MyClass &OldClass)
{
this->number = OldClass.number;
this->x = OldClass.x;
this->y = OldClass.y;
}
int MyClass::doStuff(MyClass *&classArray, int Size, int x, int y)
{
if (Size > 0)
{
classArray = new MyClass[Size];
for (int i = 0; i < Size; i++)
{
classArray[i] = MyClass(x, y);
classArray[i].number = i;
}
return Size;
}
else
return 0;
}
void MyClass::print_number()
{
std::cout << number << " " << x << " " << y << "\n";
}
int main(void)
{
MyClass *test = nullptr;
int p = MyClass::doStuff(test, 10, 5, 6);
std::cout << p << '\n';
for (int i = 0; i < p; i++) {
test[i].print_number();
}
delete[] test;
std::cin.get();
return 0;
}
答案 2 :(得分:0)
*classArray[i].number = i;
您使用空指针调用doStuff,因此classArray为null且不是数组。取消引用空指针会导致未定义的行为,在大多数实现中,您通常会崩溃。
您还取消引用不是指针的内容,因此此代码甚至无法编译。我得到的错误是:
main.cpp:23:9: error: indirection requires pointer operand ('int' invalid)
*classArray[i].number = i;
^~~~~~~~~~~~~~~~~~~~~
据推测,这只是因为,正如您所说,您显示的代码不是您的真实代码,classArray[i].number
对应于您的实际代码中的指针。但我认为无论如何我都会指出这一点,以防万一。
答案 3 :(得分:0)
根据代码的上下文,这是代码的工作示例:
#include <iostream>
class MyClass
{
public:
MyClass() {}
static int doStuff(MyClass*& classArray, size_t sz)
{
int i = 0;
for (; i < sz; i++) {
classArray[i].number = i;
}
// not sure what you want here, but this will return sz+1 if sz>0
return i;
}
void print_number()
{
std::cout << this->number << std::endl;
}
private:
int number;
};
int main(void)
{
MyClass* test = new MyClass[10];
int p = MyClass::doStuff(test, 10);
std::cout << p << '\n';
for (int i = 0; i < 10; i++) {
test[i].print_number();
}
delete[] test;
return 0;
}
虽然正如其他人所指出的那样,你正在使用C ++,虽然理解如何传递指针和数组是一个很好的练习,你可能会发现STL
和C++stdlib
包含很多这些“易于理解的语境”中的习语类型。
这是你的代码与一些C ++ STL:
#include <iostream>
#include <vector>
class MyClass
{
public:
MyClass() {}
MyClass(int i) : number(i) {}
static int doStuff(std::vector<MyClass>& classArray, size_t sz)
{
int i = 0;
for (; i < sz; i++) {
classArray.push_back(MyClass(i));
}
// not sure what you want here, but this will return sz+1 if sz>0
return i;
}
void print_number()
{
std::cout << this->number << std::endl;
}
private:
int number;
};
int main(void)
{
std::vector<MyClass> test;
int p = MyClass::doStuff(test, 10);
std::cout << test.size() << '\n';
// can use iterators here if you want
std::vector<MyClass>::iterator itr = test.begin();
for (; itr != test.end(); itr++) {
itr->print_number();
}
return 0;
}
希望可以提供帮助。