通过用户将内存分配给 class 内的列表 stl
Allocating memory to a list stl inside class through user
class Graph
{
int num;
public:
Graph(int n)
{
num = n;
}
list<int>* mylist = new list<int>[num];
int* arr = new int[num];
queue<pair < int, int >> pq;
void accept();
};
int main()
{
int n;
cout << "Enter the number of vertices=";
cin >> n;
Graph g=Graph(n);
g.accept();
}
我有这个 class 的图形,我想分配大小为 'num' 的内存,这是用户在 main 函数中的输入。但它显示内存分配错误。
你应该了解 C++ 的初始化,这很重要并且不同于赋值。
在你的例子中,mylist
和 arr
的初始化发生在 num
的“初始化”之前(事实上,你没有初始化 num
,你所做的是 default-initialize 然后分配给它),因此 num
的值在那个时候是不确定的,并且 new
抱怨“内存分配错误”。
初始化成员的正确方式:
class Graph
{
// write data members together,
// their declaration positions in class do not indicate execution order
int num;
list<int>* mylist;
int* arr;
queue<pair < int, int >> pq;
void accept();
public:
Graph(int n)
: num(n), mylist(new list<int>[n]), arr(new int[n])
// member initializer list start with a ":" and followed by a list of
// member_name(initializer_for_this_member)
// note their order should match the declaration order
{
// usually initialization all happen in the initializer list,
// and constructor body is empty
}
};
正如 πìντα ῥεῖ 指出的那样,您应该尽可能避免使用 new
并选择标准容器。在您的示例中,我猜您想要一个动态列表数组和一个动态数字数组。为此,您可以使用 std::vector
。
class Graph
{
int num;
vector<list<int>> mylist;
vector<int> arr;
queue<pair < int, int >> pq;
void accept();
public:
Graph(int n) : num(n), mylist(n), arr(n) { }
// initialize vector to contain n value-initialized objects
};
class Graph
{
int num;
public:
Graph(int n)
{
num = n;
}
list<int>* mylist = new list<int>[num];
int* arr = new int[num];
queue<pair < int, int >> pq;
void accept();
};
int main()
{
int n;
cout << "Enter the number of vertices=";
cin >> n;
Graph g=Graph(n);
g.accept();
}
我有这个 class 的图形,我想分配大小为 'num' 的内存,这是用户在 main 函数中的输入。但它显示内存分配错误。
你应该了解 C++ 的初始化,这很重要并且不同于赋值。
在你的例子中,mylist
和 arr
的初始化发生在 num
的“初始化”之前(事实上,你没有初始化 num
,你所做的是 default-initialize 然后分配给它),因此 num
的值在那个时候是不确定的,并且 new
抱怨“内存分配错误”。
初始化成员的正确方式:
class Graph
{
// write data members together,
// their declaration positions in class do not indicate execution order
int num;
list<int>* mylist;
int* arr;
queue<pair < int, int >> pq;
void accept();
public:
Graph(int n)
: num(n), mylist(new list<int>[n]), arr(new int[n])
// member initializer list start with a ":" and followed by a list of
// member_name(initializer_for_this_member)
// note their order should match the declaration order
{
// usually initialization all happen in the initializer list,
// and constructor body is empty
}
};
正如 πìντα ῥεῖ 指出的那样,您应该尽可能避免使用 new
并选择标准容器。在您的示例中,我猜您想要一个动态列表数组和一个动态数字数组。为此,您可以使用 std::vector
。
class Graph
{
int num;
vector<list<int>> mylist;
vector<int> arr;
queue<pair < int, int >> pq;
void accept();
public:
Graph(int n) : num(n), mylist(n), arr(n) { }
// initialize vector to contain n value-initialized objects
};